Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python类继承:AttributeError:';[子类]和#x27;对象没有属性';xxx和x27;_Python_Inheritance_Class Attributes - Fatal编程技术网

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
类的一个实例,检查我知道基类中存在的一个字段-我希望它默认为value
None
。但是,我的代码引发以下异常:

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)