在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教程,它没有涉及到这一点。当我在谷歌上搜索时,我发现了不止一种方法。处理这个问题的标准方法是什么?
Python(直到3版)支持"旧风格"和新的样式类。新型衍生类是从object是你使用的是,和他们的基地super()舱通过Invoke。
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知道旧的和新的风格的一类,有不同的方式,一到基地的Invoke方法,这就是为什么你会发现这么多的方式做。
为完整的缘故,老式的方法使用显式调用库类的库类。
def doit(self, foo):
return X.doit(self, foo)
但因为你不使用老式的了,我不在乎这太多了。
只知道Python 3个新样式类(不管,如果你从任何object或不)。
both
SuperClass.__init__(self, x)
或
super(SubClass,self).__init__( x )
想工作(我喜欢第二个,因为它更多的干adheres原则)。
湖在这里:http:////datamodel.html docs.python.org参考#基本定制
错了。super只适用于新样式的类,并且是使用新样式类时调用基的唯一正确方法。此外,还需要使用旧样式构造显式传递"self"。
@Ivo-在这个例子中,OP给出了一个新的样式类,并且讨论新样式和旧样式之间的区别没有什么意义,因为没有人应该再使用旧样式了。我提供的链接(到python文档)表明有不止一种"合适"的方法可以调用超级类__init__。
How do I initialize the base (super) class?
class SuperClass(object):
def __init__(self, x):
self.x = x
class SubClass(SuperClass):
def __init__(self, y):
self.y = y
使用super确保你把一个对象的方法(即结合法在法令)号决议。在Python中,你需要通过类名和绑定到一个超self__init__查找法:
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
硬编码的父这样防止你从下面的使用多继承:合作
class SubClass(SuperClass):
def __init__(self, y):
SuperClass.__init__(self, 'x') # don't do this
self.y = y
注意,只有None__init__回报可能是数据对象在不同的地方。
一些__new__
另一个很好的方式来初始化实例和它的唯一的方式subclasses of不可变类型的Python。所以它需要如果你想收藏指正str或tuple或另一个不可变的对象。
你可能认为这是一个,因为它会在classmethod隐类的论点。但它是一staticmethod。所以你需要一个明确的__new__cls呼叫。
我们通常从__new__回报的时间,所以如果你做,你需要调用你的基地的__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 sidesteps weirdness of the red __new__引起超级调用静态方法是A,但你仍然需要通cls绑定到非__new__法:
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')
为了小魔术而砰砰的一声。
3.5.2如Python,你可以使用:
class C(B):
def method(self, arg):
super().method(arg) # This does the same thing as:
# super(C, self).method(arg)
http:/ / / / / 3 docs.python.org functions.html #超级图书馆