[英]How to set an instance of base class as attribute of child class?
我试图将基类(人类)的实例设置为子类(母亲)的属性(婴儿),但是发生了意外的行为。 在我的示例中,我期望print(mother.baby.name)
打印Tom
。
如何将基类的实例设置为子类的属性?
我很确定我需要对python中的类有更深入的了解,但是我在这里缺少什么呢?
class Human:
def __init__(self, name):
Human.name = name
class Mother(Human):
def __init__(self, name_mother, name_baby):
Mother.baby = Human(name_baby)
Human.__init__(self, name_mother)
mother = Mother("Mary", "Tom")
print(mother.name)
print(mother.baby.name)
输出:
Mary
Mary
注意:我正在使用Python 3.5.2
问题
您正在根据要初始化的对象的type
设置名称。
在mother = Mother("Mary", "Tom")
,属性Human.name
已通过Mother.__init__
第2行设置为'Mary'
。
实例mother
和mother.baby
都没有属性name
:
>>> vars(mother)
>>> {}
>>> vars(mother.baby)
>>> {}
此外, Mother
类也缺少该属性:
>>> 'name' in vars(Mother)
>>> False
属性name
仅在类 Human
上设置:
>>> vars(Human)['name']
>>> 'Mary'
因此, mother.name
退回到Human.name
因为在实例mother
或类Mother
上找不到属性name
。 (当在实例和类级别上查找失败时,Python会尝试在基类中搜索适当的属性。)
mother.baby.name
也回Human.name
因为在实例mother.baby
找不到name
,但在该实例的类( Human
)上找不到该name
。
如何修复
您要在此处在实例 ( self
)上设置属性。
class Human:
def __init__(self, name):
self.name = name
class Mother(Human):
def __init__(self, name_mother, name_baby):
self.baby = Human(name_baby)
super().__init__(name_mother)
mother = Mother("Mary", "Tom")
print(mother.name)
print(mother.baby.name)
输出:
Mary
Tom
我也换了线
Human.__init__(self, name_mother)
至
super().__init__(name_mother)
因为这样可以避免对基类的名称进行硬编码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.