我想给内置的list
类型添加一些属性,所以写了这个:
class MyList(list):
def __new__(cls, *args, **kwargs):
obj = super(MyList, cls).__new__(cls, *args, **kwargs)
obj.append('FirstMen')
return obj
def __init__(self, *args, **kwargs):
self.name = 'Westeros'
def king(self):
print 'IronThrone'
if __name__ == '__main__':
my_list = MyList([1, 2, 3, 4])
print my_list
但 my_list
仅包含元素 'FirstMen'
。为什么我的 __new__
在这里不起作用?我应该如何继承像 list
这样的内置类型?像 str
这样的不可变类型也一样吗?
最佳答案
list
类型通常在其 __init__()
方法中执行列表的实际初始化,因为它是可变类型的约定。您只需要在子类型化不可变类型时覆盖 __new__()
。虽然您可以在子类化列表时覆盖 __new__()
,但对您的用例而言这样做并没有多大意义。覆盖 __init__()
更容易:
class MyList(list):
def __init__(self, *args):
list.__init__(self, *args)
self.append('FirstMen')
self.name = 'Westeros'
另外请注意,我建议不要在这种情况下使用 super()
。您想在这里调用 list.__init__()
,而不是其他任何东西。
关于Python:如何从内置列表类型继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9432719/