我如何初始化基础(超)类?
在Python中,考虑我有以下代码:
>>> class SuperClass(object): def __init__(self, x): self.x = x >>> class SubClass(SuperClass): def __init__(self, y): self.y = y # how do I initialize the SuperClass __init__ here?
如何初始化子类中的SuperClass __init__
? 我正在关注Python教程,并没有涉及到这一点。 当我在Google上search时,发现不止一种方式。 处理这个的标准方法是什么?
Python(直到版本3)支持“旧式”和新式的类。 新风格的类是从“对象”派生的,并且是你正在使用的,并且通过super()来调用它们的基类,例如
class X(object): def __init__(self, x): pass def doit(self, bar): pass class Y(X): def __init__(self): super(Y, self).__init__(123) def doit(self, foo): return super(Y, self).doit(foo)
因为python知道旧式和新式的类,所以有不同的方法来调用一个基本的方法,这就是为什么你find了多种方法。
为了完整起见,旧式类使用基类明确地调用基本方法,即
def doit(self, foo): return X.foo(self, foo)
但是既然你不再使用旧式,我也不会太在乎这个。
Python 3只知道新的类(不pipe你是否从对象派生)。
都
SuperClass.__init__(self, x)
要么
super(SubClass,self).__init__( x )
将工作(我更喜欢第二个,因为它坚持更多的DRY原则)。
看到这里: http : //docs.python.org/reference/datamodel.html#basic-customization
从python 3.5.2开始,你可以使用:
class C(B): def method(self, arg): super().method(arg) # This does the same thing as: # super(C, self).method(arg)
我如何初始化基础(超)类?
class SuperClass(object): def __init__(self, x): self.x = x class SubClass(SuperClass): def __init__(self, y): self.y = y
使用super
。 在Python 2中:
class SubClass(SuperClass): def __init__(self, y): super(SubClass, self).__init__('x') self.y = y
在Python 3中,有一些魔法让super
参数变得不必要:
class SubClass(SuperClass): def __init__(self, y): super().__init__('x') self.y = y
像这样对父进行硬编码可以防止使用协作式多重inheritance:
class SubClass(SuperClass): def __init__(self, y): SuperClass.__init__(self, 'x') # don't do this self.y = y
东西__new__
还有另一种方法来初始化实例 – 这是Python中不可变types的子类的唯一方法。 所以如果你想要str
或者tuple
或者另一个不可变的对象的子类,就需要它。
你可能认为这是一个类方法,因为它得到一个隐式的类参数。 但它实际上是一个静态方法。 所以你需要明确地用cls
调用__new__
。
你也可能需要在你的基类中调用你的基础super
。 所以,如果你使用两种方法:
class SuperClass(object): def __new__(cls, x): return super(SuperClass, cls).__new__(cls) def __init__(self, x): self.x = x class SubClass(object): def __new__(cls, y): return super(SubClass, cls).__new__(cls) def __init__(self, y): self.y = y super(SubClass, self).__init__('x')
Python 3回避了超级静态方法导致的超级调用的一些奇怪之处:
class SuperClass(object): def __new__(cls, x): return super().__new__(cls) def __init__(self, x): self.x = x class SubClass(object): def __new__(cls, y): return super().__new__(cls) def __init__(self, y): self.y = y super().__init__('x')