Python:如何使用已知的某些值初始化OOP列表?

Jim*_*los 4 python oop

我正在尝试进入面向对象编程,但我会陷入一些可能非常简单的事情.我希望有一个列表的对象,但是从传递给它的一些值开始.

例:

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].如果有人可以提供帮助,我会非常感激!

che*_*ner 7

分配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)