Python类继承:AttributeError的:“[子类]”对象没有属性“XXX”(Python

2019-06-23 20:48发布

我有以下的基类和子类:

class Event(object):
    def __init__(self, sr1=None, foobar=None):
        self.sr1 = sr1
        self.foobar = foobar
        self.state = STATE_NON_EVENT

# Event class wrappers to provide syntatic sugar
class TypeTwoEvent(Event):
    def __init__(self, level=None):
        self.sr1 = level
        self.state = STATE_EVENT_TWO

而且在我的代码,我检查一个实例TypeTwoEvent类,检查我知道存在于基类的一个领域-我希望它被默认为价值None 。 然而,我的代码引发以下异常:

AttributeError的:“TypeTwoEvent”对象有没有属性“foobar的”

我的印象是,基类的字段将由子类,即创建一个子类的实例,将实例的基类(因此调用它的构造函数)被继承...

我缺少的是在这里吗? 为什么TypeTwoEvent没有foobar属性-当其所来源的基本类有一个foobar属性?

Answer 1:

子类应该是:

class TypeTwoEvent(Event):

    def __init__(self, level=None, *args, **kwargs):
        super(TypeTwoEvent, self).__init__(*args, **kwargs)
        self.sr1 = level
        self.state = STATE_EVENT_TWO

因为你重写__init__方法,所以你需要调用父类的方法,如果你希望发生的父行为。

请记住, __init__是不是一种特殊的方法dispite其陌生的名字。 这只是在创建对象后自动调用的方法。 否则,它是一个普通的方法,而普通的继承规则适用。

super(ClassName, self).__init__(arguments, that, goes, to, parents)

是调用该方法的父版本的语法。

对于*args**kwargs ,它只是确保我们捕捉传递给所有其他参数__init__并将其传递给父类的方法,当你的孩子的方法签名没有做到这一点,家长需要这些参数来工作。



Answer 2:

你重写构造函数( __init__父类的)。 为了扩展它,你需要显式调用父类的构造函数与super()调用。

class TypeTwoEvent(Event):
    def __init__(self, level=None, **kwargs):
        # the super call to set the attributes in the parent class
        super(TypeTwoEvent, self).__init__(**kwargs)
        # now, extend other attributes
        self.sr1 = level
        self.state = STATE_EVENT_TWO

需要注意的是, super呼叫不是总是在顶部__init__在子类中的方法。 它的位置取决于你的情况和逻辑。



Answer 3:

当创建实例,它的__init__方法被调用。 在这种情况下,这是TypeTwoEvent.__init__ 。 超类的方法不会被自动调用,因为那将是非常令人困惑。

你应该叫Event.__init__(self, ...)TypeTwoEvent.__init__ (或使用super ,但如果你不熟悉它,先读了它,所以你知道你在做什么)。



Answer 4:

你需要调用__init__从基类的方法__init__继承的类的方法。

请参见这里了解如何做到这一点。



Answer 5:

我跟这个有问题还,但我的推杆super().__init__()在我的派生类的底部,这就是为什么它不工作。 因为我尝试使用未初始化的属性。



文章来源: Python class inheritance: AttributeError: '[SubClass]' object has no attribute 'xxx'