我有以下基类和子类:
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' object has no attribute 'foobar'
我的印象是基类字段将由子类继承,创建子类的实例将实例化基类(从而调用其构造函数)。。。
我错过了什么?为什么TypeTwoEvent
没有foobar
属性-而派生它的基类有foobar
属性?
您正在重写父类的构造函数(} 调用显式调用父级的构造函数。
__init__
)。要扩展它,需要用^{请注意,
super
调用不是始终位于子类中__init__
方法的顶部。它的位置取决于你的情况和逻辑。你的子类应该是:
因为您重写了
__init__
方法,所以如果希望发生父行为,则需要调用父方法。记住,
__init__
不是一个特殊的方法,它的名字很奇怪。它只是对象创建后自动调用的方法。否则它是一个普通的方法,并且应用普通的继承规则。是调用该方法的父版本的语法。
对于
*args
和**kwargs
,它只是确保我们捕获传递给__init__
的所有附加参数并将其传递给父方法,因为您的子方法签名没有这样做,父方法需要这些参数才能工作。创建实例时,将调用其
__init__
方法。在这种情况下,就是TypeTwoEvent.__init__
。超类方法不会被自动调用,因为这会非常混乱。你应该从
TypeTwoEvent.__init__
中调用Event.__init__(self, ...)
(或者使用super
,但是如果你不熟悉它,请先阅读它,以便知道你在做什么)。相关问题 更多 >
编程相关推荐