python变量继承如何工作

时间:2016-03-03 15:49:07

标签: python inheritance

我正在尝试使用Python继承的基本内容:

import os

class Parent:
    def __init__(self):
        self.text = 'parent'

    def getText(self):
        print self.text

class Child1(Parent):
    def __init__(self):
        self.x = 'x'

class Child2(Parent):
    def __init__(self):
        self.x = 'x'

if __name__ == "__main__": 
    parent = Parent()
    child1 = Child1()
    child2 = Child2()

    parent.getText()
    child1.getText()
    child2.getText()

但我一直在

  

Child1实例没有属性'text'

如何将变量传递给孩子? (我有Java / C#的背景,没有太多的Python)

4 个答案:

答案 0 :(得分:8)

你需要手动调用父类的构造函数 - 这里,self.textParent构造函数中初始化,它永远不会被调用:

class Child1(Parent):
    def __init__ (self):
        super(Child1, self).__init__ ()
        # or Parent.__init__ (self)
        self.x = 'x'

答案 1 :(得分:1)

你的init函数需要调用父init

class Child1(Parent):
def __init__(self):
    self.x = 'x'
    Parent.__init__(self)

答案 2 :(得分:1)

在python中,当你覆盖一个应该被继承的函数时,你覆盖它的全部,__ init__也不例外。您应该调用函数super方法来使用基本初始值设定项,或者在您重写的构造函数中实现该属性。

class Parent:
    def __init__(self):
        self.text = 'parent'

    def getText(self):
        print self.text

class Child1(Parent):
    def __init__(self):
        super(Child1, self).__init__()
        self.x = 'x'

child1.getText()

现在应该工作。

答案 3 :(得分:0)

从python 3.6开始,我们现在可以使用__init_subclass__函数,该函数在Child的__init__之前自动调用。

class Parent:
    def __init__(self):
        self.text = 'parent'
    
    def __init_subclass__(self):
        Parent.__init__(self)

    def getText(self):
        print(self.text)

class Child1(Parent): pass
class Child2(Parent): pass

classes = [Parent(), Child1(), Child2()]

for item in classes:
    item.getText()

输出

parent
parent
parent

如果您将Parent类更多地用作“接口”,这是另一个示例。

class Animal():
    def __init_subclass__(self, sound):
        self.sound = sound

    def make_sound(self):
        print(self.sound)

class Cat(Animal, sound='meow'): pass
class Dog(Animal, sound='woof'): pass

animals = [Cat(), Dog()]

for animal in animals:
    animal.make_sound()

输出

meow
woof