我正在尝试进入面向对象编程,但我会陷入一些可能非常简单的事情.我希望有一个列表的对象,但是从传递给它的一些值开始.
例:
class superList(list):
def __init__(self,startingValues):
self = startingValues
myList = superList([1,2,3])
myList.append(4)
print(myList)
Run Code Online (Sandbox Code Playgroud)
我希望这个输出是[1,2,3,4].如果有人可以提供帮助,我会非常感激!
分配self
是没用的; 你只是分配一个在__init__
返回后消失的本地名称.相反,您需要使用__new__
,并调用父类的__new__
方法.
class SuperList(list):
def __new__(cls, starting_values):
return list.__new__(cls, starting_values)
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用__init__
,只需将值附加到位:
class SuperList(list):
def __init__(self, starting_values):
self.extend(starting_values)
Run Code Online (Sandbox Code Playgroud)
正如评论中指出的那样,你可以通过不覆盖任何一种方法得到完全相同的结果:
class SuperList(list):
pass
Run Code Online (Sandbox Code Playgroud)
因为除了在任一方法中调用父类行为外,您没有做任何事情.在没有定义的情况下SuperList.__new__
,例如,无论如何SuperList([1,2,3])
只是调用list.__new__(SuperList, [1,2,3])
.
更有趣的是当类本身(至少部分地)确定除了使用调用者传递的值之外的行为.例如:
class SuperList(list):
def __init__(self, starting_values):
self.extend([2*x for x in starting_values])
Run Code Online (Sandbox Code Playgroud)
要么
def __init__(self):
self.extend([1,2,3])
Run Code Online (Sandbox Code Playgroud)