我需要一个行为类似字符串的类,但还需要额外的kwargs
。因此我将str
:
class Child(str):
def __init__(self, x, **kwargs):
# some code ...
pass
inst = Child('a', y=2)
print(inst)
然而这引起了:
Traceback (most recent call last):
File "/home/user1/Project/exp1.py", line 8, in <module>
inst = Child('a', y=2)
TypeError: 'y' is an invalid keyword argument for this function
这很奇怪,因为下面的代码没有任何错误:
class Child(object):
def __init__(self, x, **kwargs):
# some code ...
pass
inst = Child('a', y=2)
问题:
str
,int
,float
,tuple
等子类与object
,{{{}等其他类进行比较时,我会遇到不同的行为1}},list
等?答案 0 :(得分:7)
在这种情况下,您需要覆盖__new__
,而不是__init__
:
>>> class Child(str):
... def __new__(cls, s, **kwargs):
... inst = str.__new__(cls, s)
... inst.__dict__.update(kwargs)
... return inst
...
>>> c = Child("foo")
>>> c.upper()
'FOO'
>>> c = Child("foo", y="banana")
>>> c.upper()
'FOO'
>>> c.y
'banana'
>>>
请参阅here,了解在为__init__
,str
和int
等不可变类型进行子类化时,为什么覆盖float
不起作用的答案:
__new__()
主要用于允许不可变类型的子类(如int,str或tuple)来自定义实例创建。也是 通常在自定义元类中重写以自定义类 创建