关于python:如何初始化基类(超级)类?

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?

如何初始化子类中的SuperClass __init__?我遵循的是Python教程,它没有涉及到这一点。当我在谷歌上搜索时,我发现了不止一种方法。处理这个问题的标准方法是什么?


Python(直到3版)支持"旧风格"和新的样式类。新型衍生类是从object是你使用的是,和他们的基地super()舱通过Invoke。

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个新样式类(不管,如果你从任何object或不)。


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

使用super确保你把一个对象的方法(即结合法在法令)号决议。在Python中,你需要通过类名和绑定到一个超self__init__查找法:

1
2
3
4
 class SubClass(SuperClass):
      def __init__(self, y):
          super(SubClass, self).__init__('x')
          self.y = y

在Python 3,有一个小魔术,使得不必要的参数和作为一个super附带利益:它快一点

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

注意,只有None__init__回报可能是数据对象在不同的地方。

一些__new__

另一个很好的方式来初始化实例和它的唯一的方式subclasses of不可变类型的Python。所以它需要如果你想收藏指正strtuple或另一个不可变的对象。

你可能认为这是一个,因为它会在classmethod隐类的论点。但它是一staticmethod。所以你需要一个明确的__new__cls呼叫。

我们通常从__new__回报的时间,所以如果你做,你需要调用你的基地的__new__通过super为好的库类。如果你使用这两个方法:

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 __new__引起超级调用静态方法是A,但你仍然需要通cls绑定到非__new__法:

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 #超级图书馆