关于__new__魔法方法其他参数传入的一些问题
python3.3 以上版本的新式类中,如何在同时覆盖 __new__ 和 __init__ 时,将自定义的额外参数从 __new__ 传入 __init__ ?按我对new方法的理解不是可以处理一下传进来的参数吗,可为什么会出现图片中的问题,难道new方法只能处理不可改变类型的参数?>>> class CapStr():
def __init__(self,n):
self.n=n
def __new__(cls,n):
n=10+n
return super().__new__(cls,n)
>>> a=CapStr(10)
Traceback (most recent call last):
File "<pyshell#60>", line 1, in <module>
a=CapStr(10)
File "<pyshell#59>", line 6, in __new__
return super().__new__(cls,n)
TypeError: object.__new__() takes exactly one argument (the type to instantiate)
调用 super() 的 __new__() 不需要加 n。
>>> class CapStr():
def __init__(self,n):
self.n=n
def __new__(cls,n):
n=10+n
return super().__new__(cls)
>>> a=CapStr(10)
>>> a
<__main__.CapStr object at 0x000001DFC5E23A00>
>>> a.n
10 class T:
def __init__(self, n):
self.n = n
def __new__(cls, *args, **kwargs):
cls.nn = 20
return super().__new__(cls)
t=T(10)
print(t.nn)
print(T.nn)
#print(T.n)
处理后,就地添加,cls代表的就是类本身,self代表的就是实例化对象。 zltzlt 发表于 2020-4-1 21:44
调用 super() 的 __new__() 不需要加 n。
如果是先调用 new 为什么 传入的参数n没有经过处理 +10变成20呢 Stubborn 发表于 2020-4-1 23:31
处理后,就地添加,cls代表的就是类本身,self代表的就是实例化对象。
就是在new中传入的参数是类属性吗 秃头小宝贝 发表于 2020-4-2 10:13
如果是先调用 new 为什么 传入的参数n没有经过处理 +10变成20呢
给init和new传入的参数是一样的 建议去看一下fractions模块的源代码,你应该就能懂了 永恒的蓝色梦想 发表于 2020-4-2 10:20
建议去看一下fractions模块的源代码,你应该就能懂了
好长一段呀 我仔细看 他好像没有重载__init__ 秃头小宝贝 发表于 2020-4-2 11:08
好长一段呀 我仔细看 他好像没有重载__init__
emmm……好吧 秃头小宝贝 发表于 2020-4-2 10:16
就是在new中传入的参数是类属性吗
不是,给__new__传的参数完全取决于代码怎么写 永恒的蓝色梦想 发表于 2020-4-2 11:12
不是,给__new__传的参数完全取决于代码怎么写
可以加你一下吗 这个问题困扰我好几天了 秃头小宝贝 发表于 2020-4-2 11:44
可以加你一下吗 这个问题困扰我好几天了
好的 永恒的蓝色梦想 发表于 2020-4-2 11:45
好的
他说我没有权限加好友 你加我qq把 569522162 永恒的蓝色梦想 发表于 2020-4-2 11:12
不是,给__new__传的参数完全取决于代码怎么写
我好像有点理解了 ,我的理解是这样的,__new__主要是当继承一些不可变量的时候用来修改传进来的参数的,比如小甲鱼那个视频拿字符串来做例子,然后这种类实例后自己就是一个对象 比如所a=A() a自己就是一个对象而不像是__init__一样只是初始化一些属性,而像三楼那样的用法中cls.nn是往类中加入一个类属性,请问我这样理解没错把。 秃头小宝贝 发表于 2020-4-2 15:48
我好像有点理解了 ,我的理解是这样的,__new__主要是当继承一些不可变量的时候用来修改传进来的参数的, ...
有这样的用法。
还有一种用法,比如说你要写一个分数类,当分子和分母约分后为0时返回一个整数,这是__init__做不到的,只能用__new__来实现。 永恒的蓝色梦想 发表于 2020-4-2 15:53
有这样的用法。
还有一种用法,比如说你要写一个分数类,当分子和分母约分后为0时返回一个整数,这是__i ...
那这个分数类应该要继承 float之类的类把,我以前是这样认为的,参数n先传给new 然后new处理后再return给init现在想想应该是错了 秃头小宝贝 发表于 2020-4-2 16:47
那这个分数类应该要继承 float之类的类把,我以前是这样认为的,参数n先传给new 然后new处理后再return给 ...
不会继承自float,而是继承自 numbers.Rational
__new__ 接收到的参数和 __init__ 接收到的是同一个对象。 永恒的蓝色梦想 发表于 2020-4-2 16:55
不会继承自float,而是继承自 numbers.Rational
__new__ 接收到的参数和 __init__ 接收到的是同一个对 ...
谢谢嗷
页:
[1]