How do I initialize the base (super) class?
在python中,假设我有以下代码:
1 2 3 4 5 6 7 8 | >>> 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? |
如何初始化子类中的
Python(直到3版)支持"旧风格"和新的样式类。新型衍生类是从
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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方法,这就是为什么你会发现这么多的方式做。
为完整的缘故,老式的方法使用显式调用库类的库类。
1 2 | def doit(self, foo): return X.doit(self, foo) |
但因为你不使用老式的了,我不在乎这太多了。
只知道Python 3个新样式类(不管,如果你从任何
both
1 | SuperClass.__init__(self, x) |
或
1 | super(SubClass,self).__init__( x ) |
想工作(我喜欢第二个,因为它更多的干adheres原则)。
湖在这里:http:////datamodel.html docs.python.org参考#基本定制
How do I initialize the base (super) class?
1
2
3
4
5
6
7 class SuperClass(object):
def __init__(self, x):
self.x = x
class SubClass(SuperClass):
def __init__(self, y):
self.y = y
使用
1 2 3 4 | class SubClass(SuperClass): def __init__(self, y): super(SubClass, self).__init__('x') self.y = y |
在Python 3,有一个小魔术,使得不必要的参数和作为一个
1 2 3 4 | class SubClass(SuperClass): def __init__(self, y): super().__init__('x') self.y = y |
硬编码的父这样防止你从下面的使用多继承:合作
1 2 3 4 | class SubClass(SuperClass): def __init__(self, y): SuperClass.__init__(self, 'x') # don't do this self.y = y |
注意,只有
一些
另一个很好的方式来初始化实例和它的唯一的方式subclasses of不可变类型的Python。所以它需要如果你想收藏指正
你可能认为这是一个,因为它会在classmethod隐类的论点。但它是一staticmethod。所以你需要一个明确的
我们通常从
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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
1 2 3 4 5 6 7 8 9 10 11 12 | 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,你可以使用:
1 2 3 4 | 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 #超级图书馆