我试图将基类(人类)的实例设置为子类(母亲)的属性(婴儿),但是发生了意外的行为。
在我的示例中,我期望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
答案 0 :(得分:4)
问题
您正在设置要初始化的对象的 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)
到
var myHeader = new Headers(event.request.headers);
myHeader.delete('User-Agent');
myHeader.set('User-Agent', 'CUSTOM_USERAGENTVALUE');
因为这样可以避免对基类的名称进行硬编码。