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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值