我有这个基类和子类:
class Event:
def __init__(self, sr1=None, foobar=None):
self.sr1 = sr1
self.foobar = foobar
# Event class wrappers to provide syntatic sugar
class TypeTwoEvent(Event):
def __init__(self, level=None):
self.sr1 = level
后来,当我尝试检查foobar
的属性TypeTwoEvent
例如,我得到一个例外。例如,在 REPL 上测试:
>>> event = TypeTwoEvent()
>>> event.foobar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'TypeTwoEvent' object has no attribute 'foobar'
我认为基类属性将由子类继承,并且创建子类的实例将实例化基类(从而调用其构造函数)。因此,我预计foobar
属性值默认为None
.
Why do TypeTwoEvent
实例没有foobar
属性,尽管Event
实例呢?
子类应该是:
class TypeTwoEvent(Event):
def __init__(self, level=None, *args, **kwargs):
super().__init__(*args, **kwargs)
self.sr1 = level
Because __init__
被覆盖,基类'__init__
代码仅在明确请求时才会运行。
尽管名字很奇怪,__init__
没有经过特殊处理。创建对象后会自动调用它;但除此之外它是一个普通方法,并且适用普通继承规则。
super().__init__(arguments, that, go, to, parents)
是调用该方法的父版本的语法。使用*args
and **kwargs
让我们能够捕获传递给的附加参数__init__ https://stackoverflow.com/questions/36901 and 将它们传递给父方法 https://stackoverflow.com/questions/2921847;这样,当一个TypeTwoEvent
创建后,可以指定一个值foobar
,以及基类特定的任何其他内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)