Python类继承:AttributeError:';[子类]和#x27;对象没有属性';xxx和x27;
我有以下基类和子类:Python类继承:AttributeError:';[子类]和#x27;对象没有属性';xxx和x27;,python,inheritance,class-attributes,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): d
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
类的一个实例,检查我知道基类中存在的一个字段-我希望它默认为valueNone
。但是,我的代码引发以下异常:
AttributeError:“TypeTwoEvent”对象没有属性“foobar”
我的印象是基类字段将由子类继承,并且创建子类的实例将实例化基类(从而调用其构造函数)
我错过了什么?为什么
TypeTwoEvent
没有foobar
属性?当派生它的基类有foobar
属性时?您需要从继承类的\uuuuu init\uuuuu
方法调用基类的\uuuu init\uuuuuuu
方法
有关如何执行此操作,请参阅。创建实例时,将调用其
\uuuu init\uuu
方法。在本例中,这是typetwevent.\uuuu init\uuuu
。超类方法不会被自动调用,因为这会非常混乱
您应该调用
Event.\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。要扩展它,需要通过调用显式调用父级的构造函数
请注意,super
调用并不总是位于子类中的\uuuu init\uuuu
方法的顶部。它的位置取决于您的情况和逻辑。您的子类应该是:
class TypeTwoEvent(Event):
def __init__(self, level=None, *args, **kwargs):
super(TypeTwoEvent, self).__init__(*args, **kwargs)
self.sr1 = level
self.state = STATE_EVENT_TWO
因为重写了\uuuu init\uuuu
方法,所以如果希望发生父行为,则需要调用父方法
记住,\uuuuu init\uuuuu
不是一个特殊的方法,尽管它的名字很奇怪。它只是创建对象后自动调用的方法。否则它是一个普通的方法,普通的继承规则适用
super(ClassName, self).__init__(arguments, that, goes, to, parents)
是调用方法的父版本的语法
对于*args
和**kwargs
,它只是确保我们捕获传递给\uuuu init\uuuu
的所有附加参数,并将其传递给父方法,因为子方法签名没有这样做,父方法需要这些参数才能工作。我对此也有问题,但我已经将超级()放入了
位于派生类的底部,这就是它不起作用的原因。因为我尝试使用未初始化的属性。如下所述,您需要明确指出您希望超类也进行初始化。但是要小心:如果你有多重继承,那么实现这一点就变得非常微妙。谢谢你的编辑克里斯。我是法国人,我经常混淆“它的”和“它的”。并不是我混淆了意思,而是我学会了说话的语言,因此在我的脑海里很容易把一个声音换成另一个声音。
super(ClassName, self).__init__(arguments, that, goes, to, parents)