我有以下的基类和子类:
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
属性?
子类应该是:
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__
并将其传递给父类的方法,当你的孩子的方法签名没有做到这一点,家长需要这些参数来工作。
你重写构造函数( __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__
在子类中的方法。 它的位置取决于你的情况和逻辑。
当创建实例,它的__init__
方法被调用。 在这种情况下,这是TypeTwoEvent.__init__
。 超类的方法不会被自动调用,因为那将是非常令人困惑。
你应该叫Event.__init__(self, ...)
从TypeTwoEvent.__init__
(或使用super
,但如果你不熟悉它,先读了它,所以你知道你在做什么)。
你需要调用__init__
从基类的方法__init__
继承的类的方法。
请参见这里了解如何做到这一点。
我跟这个有问题还,但我的推杆super().__init__()
在我的派生类的底部,这就是为什么它不工作。 因为我尝试使用未初始化的属性。
文章来源: Python class inheritance: AttributeError: '[SubClass]' object has no attribute 'xxx'