当我尝试设置继承自的类的参数的值时,会引发错误str
.只有当我尝试访问参数时才会发生错误myClass(arg = 'test')
.错误是:
TypeError: 'arg' is an invalid keyword argument for this function
问题显示在此示例中:
class A(str): def __init__(self, arg): pass A("test") # Works well A(arg = "test") # Fails
只有最后一行才会引发错误.前一行效果很好.问题与从int
或继承的类相同float
.
更新(解决方案):
我找到了这些链接的解决方案:
将可选参数添加到内置类型的乘法继承子类的构造函数中?
从str或int继承
解决方案是:
class A(str): def __new__(cls, *args, **kwargs): return str.__new__(cls) def __init__(self, arg01): print(arg01) A(arg01= "test")
我不确切知道为什么会有效,我会对此进行调查.如果有人有明确的解释,我很感兴趣,我提前感谢他.
更新(我的解释):
我不确定我会说什么,但这就是我所理解的.
想象一下'myClass'
没有任何遗产的课程.当我这样做时myInstance = myClass()
,会发生以下情况:
该方法myClass.__new__
被执行.此方法将创建对象myInstance
.__new__
是真正的构造函数(__init__
不是构造函数!).在伪代码中,__new__
看起来像这样:
def __new__ (cls, *args, **kwargs): myInstance = # Do some stuff to create myInstance, an object of the type passed as argument (cls). # Add the method __init__ to myInstance. # Call __init__ and pass to it the list 'args' and the dictionary 'kwargs' (both come from arguments of __new__). Pass to it also the object itself (self) : obj.__init__(self, args, kwargs) : # Do some stuff.
当我们使用不可变类型(str,int,float,tuple)时,情况会有所不同.在之前的伪代码中,我写道def __new__(cls, *args, **kwargs)
.对于不可变类型,该方法的伪代码__new__
更像是这样def __new__(cls, anUniqueValue)
.我并不真正理解为什么这种行为不同于immutableTypes.__new__
其他行为,但事实并非如此.你可以在这个例子中看到它:
class foo(): def __init__(self): pass foo.__new__(foo, arg = 1) # That works because the method __new__ look like this : def __new__(*args, **kargs). str.__new__(str, arg = 1) # That fails because we are trying to pass the attribute 'arg' to a method which look like this : def __new__(anUniqueValue).
从那里,我们可以理解为什么之前提出的解决方案有效.我们所做的是编辑__new__
不可变类型的方法,就像一个可变类型一样工作.
def __new__(cls, *args, **kwargs): return str.__new__(cls)
这2行转换 def __new__ (cls, anUniqueValue)
为def __new__ (cls, *args, **kwargs)
我希望我的解释几乎清楚,没有太多错误.如果你说法语,你可以学到更多的链接:http://sametmax.com/la-difference-entre- 新 -et- 初始化烯蟒蛇/