为了账号安全,请及时绑定邮箱和手机立即绑定

python中的链调用父初始化程序

python中的链调用父初始化程序

慕的地10843 2019-11-05 15:21:43
考虑一下-基类A,类B从A继承,类C从B继承。在初始化器中调用父类初始化器的通用方法是什么?如果这听起来仍然不太明确,请使用以下代码。class A(object):    def __init__(self):        print "Initialiser A was called"class B(A):    def __init__(self):        super(B,self).__init__()        print "Initialiser B was called"class C(B):    def __init__(self):        super(C,self).__init__()        print "Initialiser C was called"c = C()这就是我现在的做法。但是它似乎仍然太泛泛,您仍然必须手动传递正确的类型。现在,我尝试使用self.__class__super()作为第一个参数,但是显然,它不起作用-如果将其放在C的初始化程序中-足够公平,B的初始化程序将被调用。如果在B中执行相同的操作,则“ self”仍指向C的实例,因此您最终再次调用B的初始化程序(此操作以无限递归结束)。现在无需考虑钻石继承,我只是想解决这个特定问题。
查看完整描述

3 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

确实推荐这样做(对于Python 2.x)。

是否明确将类传递给类super的问题是样式问题,而不是功能问题。通过该类以super符合Python的“显式优于隐式”的哲学。


查看完整回答
反对 回复 2019-11-05
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

super(X,obj)实际上返回一个特殊的“ super”对象,当您对其进行属性访问时,该对象将返回如果类X根本没有属性,则该属性将被返回。例如,super(X,obj).__ init__将返回obj的init方法,就好像没有X类中的init一样。现在,如果类X有两个父级,并且X .__ init__不存在,则默认行为是仅调用其中一个父级的init,而不是两个父级的init。这实际上是super在做的事情……给您父母之一。

查看完整回答
反对 回复 2019-11-05
  • 3 回答
  • 0 关注
  • 281 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信