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

Python:如何用一些已知的值初始化OOP列表?,python,oop,Python,Oop,我正试图进入面向对象编程,但我被一些可能非常简单的东西卡住了。我想要一个对象,它是一个列表,但它首先要向其中传递一些值 例如: class superList(list): def __init__(self,startingValues): self = startingValues myList = superList([1,2,3]) myList.append(4) print(myList) 我希望这个的输出是[1,2,3,4]。如果有人能帮忙,我将非常感激

我正试图进入面向对象编程,但我被一些可能非常简单的东西卡住了。我想要一个对象,它是一个列表,但它首先要向其中传递一些值

例如:

class superList(list):
    def __init__(self,startingValues):
        self = startingValues

myList = superList([1,2,3])
myList.append(4)
print(myList)

我希望这个的输出是[1,2,3,4]。如果有人能帮忙,我将非常感激

分配给
self
没有用;您只是在分配一个本地名称,该名称在
\uuuu init\uuuu
返回后消失。相反,您需要使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,并调用父类的
\uuuuuuuuuuuuuuuuuuuuuuu
方法

class SuperList(list):
    def __new__(cls, starting_values):
        return list.__new__(cls, starting_values)
另一种方法是使用
\uuuuu init\uuuu
,只需将值附加到位:

class SuperList(list):
    def __init__(self, starting_values):
        self.extend(starting_values)
但是,正如注释中所指出的,不重写任何一种方法都会得到完全相同的结果:

class SuperList(list):
    pass
因为除了在两个方法中调用父类行为之外,您什么都不做。例如,在没有定义的
超级列表的情况下,
超级列表([1,2,3])
只调用
列表

更有趣的是,当类本身(至少在一定程度上)决定调用方传递的值以外的行为时。例如:

class SuperList(list):
    def __init__(self, starting_values):
        self.extend([2*x for x in starting_values])


不要继承内置类型,至少在初学者和没有阅读过这些内置类型的实际实现之前是这样

你可以做的是写一个包装,大致如下:

class MyList(object):

    def __init__(self, init_values):
        self.myList = []
        self.myList.extend(init_values)

    def append(self, value):
        self.myList.append(value)

    def __getitem__(self, _slice):
        return self.myList[_slice]

注意:这只是为了让您了解如何做您想做的事情,您必须实现一些额外的案例和方法,才能真正拥有内置的大部分功能。

不要继承自
列表
或其他内置类型。结局很少好。另外,我看不出您的类与普通列表有什么不同。它当前与列表相同,但稍后我将向它添加更多的方法。有没有其他方法可以使对象具有类似列表的行为?(myList[3]=“bacon”)这太棒了!第二种方法是完美的。祝你过得愉快,切普纳!chepner,好奇,为什么要显式地列出
list.\uuuu new\uuuuuuuuuuuuuuuuuuuuuuuuuu(cls,起始值)
而不是
super()。使用
super
具有特定的语义含义,与硬编码父类没有什么区别,只是不同而已。谢谢您的建议。
class MyList(object):

    def __init__(self, init_values):
        self.myList = []
        self.myList.extend(init_values)

    def append(self, value):
        self.myList.append(value)

    def __getitem__(self, _slice):
        return self.myList[_slice]