我试图将基类(Human)的实例设置为子类(Mother)的属性(baby),但得到了意外的行为。
在我的示例中,我希望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
注意:Am使用Python3.5.2
最佳答案
问题
您正在初始化的对象的type
上设置名称。mother = Mother("Mary", "Tom")
之后,属性Human.name
通过'Mary'
的第2行设置为Mother.__init__
。
实例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
,因为在实例name
或类mother
上找不到属性Mother
。(当在实例和类级别上的查找失败时,Python尝试在基类中搜索适当的属性。)mother.baby.name
也返回到Human.name
,因为在实例name
中找不到mother.baby
,而是在该实例的类(Human
)上。如何修复
要在此处设置实例(
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)
因为这样可以避免对基类的名称进行硬编码。
关于python - 如何将基类的实例设置为子类的属性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53361804/