我正在尝试使用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)
答案 0 :(得分:8)
你需要手动调用父类的构造函数 - 这里,self.text
在Parent
构造函数中初始化,它永远不会被调用:
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