博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python类继承的重写和super
阅读量:6936 次
发布时间:2019-06-27

本文共 2275 字,大约阅读时间需要 7 分钟。

给已经存在的类添加新的行为,继承是非常好的实现方式。但是如果要改变行为呢?比如在我们的contact类只允许一个名字和一个邮箱,但是如果要对某些人增加电话号码呢?这里可以通过非常简单的给他增加一个电话号码的属性来实现,但是如果想这第3个变量在初始化类的时候就可用,就需要重写__init__函数

重写就是在子类里用一个(和超类相同的名字)新的方法来改变或者覆盖超类里的这个方法。做这个不需要特殊的语法,会自动执行子类新创建的方法而不是超类的方法。以下是在之前Contact类中,使用Friend子类来继承

class ContactList(list):    def search(self, name):        '''Return all contacts that contain the search value           in their name.'''        matching_contacts = []        for contact in self:            if name in contact.name:                matching_contacts.append(contact)        return matching_contactsclass Contact:    all_contacts = ContactList()      def __init__(self, name, email):        self.name = name        self.email = email        Contact.all_contacts.append(self)class Supplier(Contact):    def order(self, order):        print("If this were a real system we would send"                 "{} order to {}".format(order, self.name))class Friend(Contact):    '''以下是重写方法,注意这个方法没有将name和email等加入父类的all_contact   '''    def __init__(self, name, email, phone):        self.name = name         self.email = email        self.phone = phoneclass Friend1(Contact):    '''通过super得到父类对象的实例,并且调用这个对象的__init__方法,       传递给它预期的参数,然后这个类做了自己的初始化,即设置phone属性'''    def __init__(self, name, email, phone):        super().__init__(name, email)        self.phone = phone

不只有__init__,任何方法都可以被重写。在这个例子中,Contact和Friend类有重复的代码来创建name和email,这会导致维护变得复杂。需要警惕的是,Friend类忽略了把自己加到all_contacts列表里,这个列表是我们在Contact类里创建的。将以上代码保存为order.py脚本,如下是在交互的解释器里运行的结果如下:

$ python -i order.py >>> c1 = Contact("John A", "johna@example.com")>>> c2 = Contact("John B", "johnb@example.com")>>> c3 = Contact("Jenna C", "jennac@example.com")>>> c4 = Friend("Friend c", "Friendc@example.com",'0592-5566778')>>> c5 = Friend("Friend 5", "Friend5@example.com",'0592-1122334')>>> c6 = Friend1("Friend 6", "Friend6@example.com",'0592-4455667')>>> c7 = Friend1("Friend 7", "Friend7@example.com",'0592-7788990')>>> [c.name for c in Contact.all_contacts]['John A', 'John B', 'Jenna C', 'Friend 6', 'Friend 7']

我们真正需要的是一种可以调用父类的代码的方法,这个就是super函数的功能,他返回一个父类的实例化对象,允许我们直接调用父类的方法,如上例中的Friend1类。

super()可以在任何方法中调用,不只是__init__方法,这就意味着通过重写和调用super,可以修改所有的方法。可以在方法的任何位置用super。

 

参考:

1、《Python3 面向对象编程》 [加]Dusty Philips 著

转载于:https://www.cnblogs.com/anovana/p/8142686.html

你可能感兴趣的文章
R语言 vegan包计算物种累计曲线
查看>>
hive-数据模型
查看>>
s3c2440代码重定位和段的引入——学以致用,综合Makefile的锻炼
查看>>
SQL Server AlwaysON从入门到进阶(6)——分析和部署AlwaysOn Availability Group
查看>>
[原创]华为战略管理培训体会
查看>>
SQL2008R2 安装图解
查看>>
Linux:日期用法,及格式定义
查看>>
jQuery对象
查看>>
JavaScript -- 定义二维数组
查看>>
一行代码搞定 FTP 服务
查看>>
Intellij IDEA光标保持自动缩进,设置下次不放在行首
查看>>
实验c语言不同类型的指针互用(不推荐只是学习用)
查看>>
iOS:NSFileHandle和NSFileManger的使用
查看>>
HTML5新特性之文件和二进制数据的操作
查看>>
Camtasia Studio CamStudio如何不录制鼠标
查看>>
内核源码阅读(三)进程命名空间和用户命名的实现
查看>>
redis两种持久化方式的优缺点
查看>>
腾讯2016笔试题-微信红包-找出数组中过半数的数字
查看>>
Vivado下生成及烧写MCS文件
查看>>
python基础技巧综合训练题1
查看>>