我正在尝试进入面向对象编程,但我遇到的问题可能非常简单。我希望有一个列表的对象,但是从传递给它的一些值开始。
示例:
class superList(list):
def __init__(self,startingValues):
self = startingValues
myList = superList([1,2,3])
myList.append(4)
print(myList)
我希望这个输出为[1,2,3,4]。如果有人可以提供帮助,我会非常感激!
答案 0 :(得分:7)
分配给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])
答案 1 :(得分:1)
不要继承内置类型,至少不是作为初学者而且没有阅读过这些内置类型的实际实现。
你能做的就是写一个包装器,就像这样:
git rebase --interactive --root
注意:这只是为了让您了解如何做您想做的事情,您必须实现一些额外的案例和方法来实际拥有内置函数的大部分功能。