我正在尝试进入面向对象编程,但在一些可能非常简单的事情上卡住了。我想要一个对象,它是一个列表,但首先要将一些值传递给它。
例子:
class superList(list):
def __init__(self,startingValues):
self = startingValues
myList = superList([1,2,3])
myList.append(4)
print(myList)
我希望它的输出是 [1,2,3,4]。如果有人能提供帮助,我将不胜感激!
最佳答案
分配给 self
没有用;您只是分配给一个在 __init__
返回后消失的本地名称。相反,您需要使用 __new__
,并调用父类的 __new__
方法。
class SuperList(list):
def __new__(cls, starting_values):
return list.__new__(cls, starting_values)
另一种方法是使用 __init__
,并在适当的位置附加值:
class SuperList(list):
def __init__(self, starting_values):
self.extend(starting_values)
不过,正如评论中所指出的,如果不重写任何一种方法,您将获得完全相同的结果:
class SuperList(list):
pass
因为除了在任一方法中调用父类行为外,您没有做任何事情。在没有定义的 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])
或
def __init__(self):
self.extend([1,2,3])
关于Python:如何用一些已知的值初始化 OOP 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48129617/