Super()不保留父母的班级信息

时间:2019-12-06 14:33:02

标签: python oop

试图理解super(),我举了两个例子,但是它们返回相同的结果。

这是super()

class Person1():
    def __init__(self, name):
        self.name = name

class EmailPerson1(Person1):
    def __init__(self, name, email):
        super().__init__(name)
        self.email = email       

bob2 = Person('Dim')
bob = EmailPerson1('Bob Frapples', 'bob@frapples.com')
bob.name

'鲍勃·弗洛普莱斯'

并且没有super()

class Person():
    def __init__(self, name):
        self.name = name

class EmailPerson(Person):
    def __init__(self, name, email):
        self.name = name
        self.email = email       

bob2 = Person('Dim')
bob1 = EmailPerson('Bob Frapples', 'bob@frapples.com')
bob1.name

'鲍勃·弗洛普莱斯'

有什么区别?第一个版本应该使用我认为的父类的名称。

1 个答案:

答案 0 :(得分:0)

区别在于您是手动复制Person.__init__EmailPerson.__init__所做的工作,而不是使用super().__init__来确保继承的初始化程序完成了所需的工作。

class Person():
    def __init__(self, name):
        self.name = name

class EmailPerson(Person):
    def __init__(self, name, email):
        self.name = name
        self.email = email

使用super,即

class EmailPerson(Person):
    def __init__(self, name, email):
        super().__init__(name)
        self.email = email

表示如果有人更新了Person的定义以在Person.__init__中做一些额外的工作:

class Person:
    def __init__(self, name):
        self.name = name.title()  # bob grapples -> Bob Frapples

您完全不需要更新EmailPerson 的定义即可利用新的更改。