sharank 发表于 2020-8-1 23:04:22

定义一个类继承于 int 类型,当传入参数为字符串,则输出所有字符ASCCI码的和

class Nint(int):
    def __init__(self, arg):
      if isinstance(arg, str):
            self.result = 0
            for each in arg:
                self.result += ord(each)
      else:
            self.result = int(arg)

    def __repr__(self):
      return str(self.result)

    __str__ = __repr__


为啥print(Nint(3))、print(Nint('32'))都行,但print(Nint('i love fishc'))就报错?

永恒的蓝色梦想 发表于 2020-8-1 23:18:35

这样就好了:class Nint(int):
    def __new__(cls, arg, /):
      return int.__new__(cls, sum(map(ord, arg)) if isinstance(arg, str) else arg)

Twilight6 发表于 2020-8-1 23:34:32



你继承了 int 类,导致 __new__ 创建实例化过程不能将非整数字符串转化为 int 对象而报错,所以你应该重写 __new__ 而不是 __init__

重写了 __new__ 如果直接设置返回的是 result 值,那么就不必设置 __repr__ 方法了,因为此时返回的是 int的实力对象了,而不是 Nint 了

正确代码:

class Nint(int):
    def __new__(self, arg):
      if isinstance(arg, str):
            result = 0
            for each in arg:
                result += ord(each)
      else:
            result = int(arg)
      return result

print(Nint(3))
print(Nint('32'))
print(Nint('i love fishc'))

输出结果:
3
101
1132

永恒的蓝色梦想 发表于 2020-8-1 23:54:53

Twilight6 发表于 2020-8-1 23:34
你继承了 int 类,导致 __new__ 创建实例化过程不能将非整数字符串转化为 int 对象而报错,所以你应该 ...

重写了 __new__ 如果直接设置返回的是 result 值,那么就不必设置 __repr__ 方法了,因为此时返回的是 int的实力对象了,而不是 Nint 了1.错字。
2.即使是 Nint 对象也不必设置,因为会继承。

sharank 发表于 2020-8-2 09:30:25

Twilight6 发表于 2020-8-1 23:34
你继承了 int 类,导致 __new__ 创建实例化过程不能将非整数字符串转化为 int 对象而报错,所以你应该 ...

感谢

sharank 发表于 2020-8-2 09:42:33

永恒的蓝色梦想 发表于 2020-8-1 23:18
这样就好了:

感谢!很强!
页: [1]
查看完整版本: 定义一个类继承于 int 类型,当传入参数为字符串,则输出所有字符ASCCI码的和