在从python对象继承的Class和从另一个用户定义的Class继承的Class上使用super()之间的区别是什么

时间:2014-02-01 14:15:13

标签: python

这种好奇心所带来的差异和问题是什么:

class A(object):
    def __init__(self):
        super(A, self).__init__()

class A(object):
    def __init__(self):
        pass

class B(A):
    def __init__(self):
        super(B, self).__init__()

即使第一个例子是错误的,它也可以。我认为这可能是一个冗余,但我听说在一个继承自object的类中使用super()是错误的,但为什么呢?

2 个答案:

答案 0 :(得分:1)

使用super(A, self).__init__()就好了; object也有__init__方法。

的工作是尝试将参数传递给该方法; object.__init__()不带参数。对于大多数方法其他而不是__init__,直接从super()派生的类中的object也可能无效,因为object没有特定的你试图打电话的方法。

因此,将super(class, self).__init__()与除空参数列表之外的任何内容一起使用时,需要对类层次结构有更深入的了解,其中任何直接从object派生的类都应该注意不要传递参数。

对于任何自定义方法,super(class, self).other_method很可能会失败,因为object根本没有实现该方法。

答案 1 :(得分:1)

super(class.self)是一个与所谓的MRO或方法解析顺序交互的方式。

一个非常重要的概念。这是MRO上的Guido:http://python-history.blogspot.com/2010/06/method-resolution-order.html?m=1