Python 语言及其应用 Chapter_6_Note 1 类的super功能



使用super从父类得到帮助
我们已经知道如何在子类中覆盖父类的方法,但如果想要调用父类的方法怎么办?
“哈哈!终于等到你问这个了。”super() 站出来说道。下面的例子将定义一个新的类
EmailPerson,用于表示有电子邮箱的Person。首先,来定义熟悉的Person 类:
>>> class Person():
... def __init__(self, name):
... self.name = name
...

下面是子类的定义。注意,子类的初始化方法__init__() 中添加了一个额外的email
参数:
>>> class EmailPerson(Person):
... def __init__(self, name, email):
... super().__init__(name)
... self.email = email
在子类中定义__init__() 方法时,父类的__init__() 方法会被覆盖。因此,在子类中,
父类的初始化方法并不会被自动调用,我们必须显式调用它。以上代码实际上做了这样几
件事情。
• 通过super() 方法获取了父类Person 的定义。
• 子类的__init__() 调用了Person.__init__() 方法。它会自动将self 参数传递给父类。
因此,你只需传入其余参数即可。在上面的例子中,Person() 能接受的其余参数指的是
name。
• self.email = email 这行新的代码才真正起到了将EmailPerson 与Person 区分开的作用。
接下来,创建一个EmailPerson 类的对象:
>>> bob = EmailPerson('Bob Frapples', 'bob@frapples.com')
我们既可以访问name 特性,也可以访问email 特性:
>>> bob.name
'Bob Frapples'
>>> bob.email
'bob@frapples.com'
为什么不像下面这样定义EmailPerson 类呢?
>>> class EmailPerson(Person):
... def __init__(self, name, email):
... self.name = name
... self.email = email
确实可以这么做,但这有悖我们使用继承的初衷。我们应该使用super() 来让Person 完成
它应该做的事情,就像任何一个单纯的Person 对象一样。除此之外,不这么写还有另一个
好处:如果Person 类的定义在未来发生改变,使用super() 可以保证这些改变会自动反映
到EmailPerson 类上,而不需要手动修改。
子类可以按照自己的方式处理问题,但如果仍需要借助父类的帮助,使用super() 是最佳
的选择(就像现实生活中孩子与父母的关系一样)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值