Python类继承:AttributeError:'[SubClass]'对象没有属性'xxx'

Hom*_*lli 20 python inheritance class-attributes

我有以下基类和子类:

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
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我正在检查TypeTwoEvent类的实例,检查我知道在基类中存在的字段 - 我希望它默认值为None.但是,我的代码引发了以下异常:

AttributeError:'TypeTwoEvent'对象没有属性'foobar'

我的印象是基类字段将由子类继承,并且创建子类的实例将实例化基类(从而调用其构造函数)...

我在这里失踪了什么?为什么TypeTwoEvent没有一个None属性-当其所来源的基本类有一个TypeTwoEvent属性?

e-s*_*tis 22

你的子类应该是:

class TypeTwoEvent(Event):

    def __init__(self, level=None, *args, **kwargs):
        super(TypeTwoEvent, self).__init__(*args, **kwargs)
        self.sr1 = level
        self.state = STATE_EVENT_TWO
Run Code Online (Sandbox Code Playgroud)

因为您重写了该__init__方法,所以如果您希望父行为发生,则需要调用父方法.

记住,__init__并不是一种特殊的方法来摒弃它的陌生名称.它只是在创建对象后自动调用的方法.否则它是普通方法,并且适用普通继承规则.

super(ClassName, self).__init__(arguments, that, goes, to, parents)
Run Code Online (Sandbox Code Playgroud)

是调用方法的父版本的语法.

对于*args**kwargs,它只是确保我们捕获传递给__init__它的所有其他参数并将其传递给父方法,因为子方法签名没有这样做,并且父级需要这些参数才能工作.