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

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

class ContactList(list):def search(self, name):'''Return all contacts that contain the search valuein 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 = nameself.email = emailContact.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 = emailself.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

python类继承的重写和super相关推荐

  1. Python 类继承,__bases__, __mro__, super

    Python是面向对象的编程语言,也支持类继承. >>> class Base: ... pass ... >>> class Derived(Base): ... ...

  2. python类继承实例_Python实现类继承实例

    Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,本文就举一例Python类继承的实例. 实例代码如下: #! /usr/bin/python # Filename: inherit ...

  3. python类继承实例_python类继承与子类实例初始化用法分析

    这篇文章主要介绍了python类继承与子类实例初始化用法,实例分析了Python类的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下 [ 先贴参考书籍原文(中文英文对照)] __init__方法介 ...

  4. Python类继承及super()函数

    文章目录 Python中单类继承 普通类方法继承 初始化函数继承 Python中多类继承 Python中单类继承 Python是一门面向对象的编程语言,支持类继承.新的类称为子类(Subclass), ...

  5. python类继承中构造方法_第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解...

    第8.3节Python类的__init__方法深入剖析:构造方法与继承详解 一.    引言 上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类没 ...

  6. python 类继承 父类初始化_python之子类继承父类时进行初始化的一些问题

    直接看代码: classPerson:def __init__(self): self.name= "jack" classStudent(Person):def __init__ ...

  7. python 类继承list,为什么继承 Python 内置类型会出问题?!

    本文出自"Python为什么"系列,请查看全部文章 不久前,Python猫 给大家推荐了一本书<流畅的Python>(点击可跳转阅读),那篇文章有比较多的"溢 ...

  8. Python 类继承与多重继承

    python中新定义一个类称为子类,被继承的类称为父类:子类继承父类后就拥有了父类的所有特性. #语法格式 class 子类名(父类名):pass 如下:定义了Person类,一个Student类,但 ...

  9. python类继承返回值_python继承threading.Thread实现有返回值的子类实例

    继承与threading.thread实现有返回值的子类mythread,废话不多说,大家直接看代码 import threading class mythread(threading.thread) ...

最新文章

  1. mysql基本操作 [http://www.cnblogs.com/ggjucheng/archive/2012/11/03/2752082.html]
  2. 涨姿势:另类的表情域名赚钱大法!!
  3. 互联网公司面试经历(转载)
  4. 【jzoj】2018.2.7NOIP普及组——某【BC】组模拟赛
  5. HTTP协议具体解释
  6. 边际概率条件概率_数据科学家解释的边际联合和条件概率
  7. 看完这一篇,你就对 Spring Security 略窥门径了 | 原力计划
  8. Flash和margue字幕滚动效果
  9. AndroidStudio_安卓原生开发_自定义服务器Token验证_MD5加密方法---Android原生开发工作笔记156
  10. zabbix在ubuntu16.04上的安装
  11. 富士康对夏普收购报价大幅缩水20多亿美元
  12. MySQL数据类型有哪些?
  13. Apache日志格式与配置
  14. Git报错:/c/Users/zhouy/AppData/Roaming/npm/hexo: line 12: node: command not found
  15. emacs terminal
  16. STATA面板数据模型进行Hausman检验
  17. IT项目经理沟通技巧的重要性
  18. iTunes只能装C盘吗_iphone备份太大,严重挤占C盘空间,怎么把备份放在其他的硬盘?...
  19. oracle ora 3136,ALERT日志中常见监听错误:ORA-3136错误的排查
  20. Problem L 七段显示器显示整数

热门文章

  1. chrome添加来自其他网站的扩展程序
  2. 国际农产品交易模式 东亚模式对话国际农民丰收节贸易会
  3. 兴林村脱贫谋定向往宜居村庄-农业大健康·万祥军:美丽蝶变
  4. android第三次作业
  5. 怎样 获取 ios的系统版本
  6. wechall.net/stegano 解题心得
  7. Sql Server的弱口令入侵测试以及防范
  8. JS判断数字字母中文
  9. hibernate 高级查询 query 或查询 or ,Restrictions
  10. 干货 | B端产品如何设计权限系统?