python类继承的重写和super
给已经存在的类添加新的行为,继承是非常好的实现方式。但是如果要改变行为呢?比如在Python继承扩展内置类,我们的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_contacts class 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 = phone class 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 著
python类继承的重写和super的更多相关文章
- Python 类继承,__bases__, __mro__, super
Python是面向对象的编程语言,也支持类继承. >>> class Base: ... pass ... >>> class Derived(Base): ... ...
- python 类继承演示范例的代码
把做工程过程重要的代码片段备份一次,下面的资料是关于python 类继承演示范例的代码. # a simple example of a class inheritance # tested with ...
- Python类继承(转发)
目录 一.概述 二.类的继承 2.1 继承的定义 2.2 构造函数的继承 2.3 子类对父类方法的重写 三.类继承的事例 回到顶部 一.概述 面向对象编程 (OOP) 语言的一个主要功能就是“继承”. ...
- 第7.7节 案例详解:Python类继承机制
本节实现一个类继承的小程序,下面一边结合代码一边介绍相关继承的知识.例子以车.汽车为例,车为父类.汽车为子类. 一. 定义父类Vehicle class Vehicle(): def __ ...
- python 类 - 继承
继承 什么是继承? 编写类时,并非总要从空白开始.如果要编写的类是另一个现成类的特殊版本,可使用继承. 一个类继承另一个类时,将自动获得另一个类的所有属性和方法.现有的类称为父类,而新类称为子类. 子 ...
- python类继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过 继承 机制.继承完全可以理解成类之间的 类型和子类型 关系. 假设你想要写一个程序来记录学校之中的教师和学生情况.他们有一些 ...
- Python类继承,方法重写及私有方法
# -*- coding: utf-8 -*- """ Created on Mon Nov 12 15:05:20 2018 @author: zhen "& ...
- 『无为则无心』Python面向对象 — 54、重写和super()函数
目录 1.重写 2.super()函数 方式一 方式二 __mro__内置类属性说明 1.重写 在子类中如果有和父类同名的方法,则通过子类实例去调用该方法时,会调用子类中的该方法而不是父类的方法,这个 ...
- 乐字节Java继承|方法重写、super和final关键字
大家好,乐字节的小乐又来了,上一篇是:乐字节Java|JavaBean.继承与权限修饰,也是属于Java继承的,今天继续Java继承. 一. 方法的重写 父类不满足子类的要求,按需改写.注意 方法签名 ...
随机推荐
- Ftp、Ftps与Sftp之间的区别
Ftp FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Applica ...
- 打包一个UWP APP
Before packaging your app Test your app. Before you package your app for store submission, make sure ...
- vuex2.0 基本使用(3) --- getter
有的组件中获取到 store 中的state, 需要对进行加工才能使用,computed 属性中就需要写操作函数,如果有多个组件中都需要进行这个操作,那么在各个组件中都写相同的函数,那就非常麻烦,这 ...
- [BZOJ 2186] [SDOI 2008] 沙拉公主的困惑
Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为 \(1\) 到 \(N\) 的阶乘,但是,政府只发行编号与 \(M!\) 互质的钞票.房地产第 ...
- Android Studio 显示 logcat
首先调出 logcat,在整个android studio的左下角(藏的好,尼玛.) 接着设置下面三个红框 1 选择你自己的模拟器. 2 选择Warm 3 选择not filter
- 【XSY2693】景中人 区间DP
题目描述 平面上有\(n\)个点,你要用一些矩形覆盖这些点,要求: 每个矩形的下边界为\(y=0\) 每个矩形的大小不大于\(s\) 问你最少要用几个矩形. \(n\leq 100,1\leq y\l ...
- swagger如何测试List类型参数
使用swagger 时,往往会用到类似下面这样的注解 @ApiImplicitParam(name = "id", value = "主键", dataType ...
- RFC2544测试指标
RFC2544测试指标 参考:https://wenku.baidu.com/view/3abbb5bf960590c69ec3769d.html RFC2544性能测试介绍 参考:https:// ...
- maven编译时出现There are test failures
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.10:test (default-tes ...
- [APIO2012]守卫
近日状态并不是很好, 很不稳, 思路也不是很清晰 希望自己能走出来 题意:有序列1~n 现给出两种区间 区间0:序号在[x, y]的节点不能有忍者 区间1:序号在[x, y]的节点区间里至少有一个忍者 ...