如何将基类的实例设置为子类的属性?

时间:2018-11-18 14:11:28

标签: python

我试图将基类(人类)的实例设置为子类(母亲)的属性(婴儿),但是发生了意外的行为。 在我的示例中,我期望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

1 个答案:

答案 0 :(得分:4)

问题

您正在设置要初始化的对象的 type 上的名称。

mother = Mother("Mary", "Tom")之后,属性Human.name已通过'Mary'的第2行设置为Mother.__init__

实例mothermother.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');

因为这样可以避免对基类的名称进行硬编码。