|
发表于 2019-9-5 23:47:07
|
显示全部楼层
回帖奖励 +3 鱼币
当你需要实例化对象的时候会先调用__new__,创建并返回实例,具体还是百度吧,说的肯定比我好。
上述程序你实例化的时候调用__new__返回的是一个整型数字,实例化后的对象类型为INT不是NINT了,所以无法调用NINT里的数据(所以n和self.n没什么区别了)
- class NINT(int):
- def __new__(self,num):
- n=num
- if isinstance(n,str):
- n=0
- for i in range(len(num)):
- n+=ord(num[i])
- else: n=int(n)
- return int.__new__(self,num)
- c = NINT(3)
- print(c)
- print(type(c))
- print(c.n)
- #输出
- 3
- <class '__main__.NINT'>
- Traceback (most recent call last):
- File "C:\Users\Jin\Desktop\新建文本文档.py", line 14, in <module>
- print(c,c.n)
- AttributeError: 'NINT' object has no attribute 'n'
复制代码
修改__new__后,返回了NINT类对象,想要调用n,要直接使用c,比如 print(c+3),输出为6,无法直接调用c.n
- class NINT(int):
- def __new__(self,num):
- self.n=num
- if isinstance(num,str):
- self.n=0
- for i in range(len(num)):
- self.n+=ord(num[i])
-
- else: self.n=int(self.n)
- return int.__new__(self,num)
- c = NINT(3)
- print(c)
- print(type(c))
- print(c.n)
- #输出
- 3
- <class '__main__.NINT'>
- 3
复制代码
写入self后,能通c.n来调用n |
|