Python继承、方法重写
继承
在编写类时,并不是每次都要从空白开始。当要编写的类和另一个已经存在的类之间存在一定的继承关系时,就可以通过继承来达到代码重用的目的,提高开发效率。
class one():
"""类的帮助信息""" # 类的说明
Code # 类体
class two(one):
"""类的帮助信息""" # 类的说明
Code # 类体
示例代码1:
class Demo:
@property
def print_value(self):
return 1
class Demo2(Demo): # 将Demo传入Demo2,让Demo2继承Demo的功能(可以使用Demo的功能)
@property
def print_value2(self):
return 2
value = Demo2()
print(value.print_value) # 可以看到继承了Demo后我们就可以直接访问到Demo中的属性了
执行结果:
1
示例代码2:
class Fruit:
color = '绿色'
def harvest(self, color):
print(f"水果是:{color}的!")
print("水果已经收获...")
print(f"水果原来是{Fruit.color}的!")
class Apple(Fruit):
color = "红色"
def __init__(self):
print("我是苹果")
class Orange(Fruit):
color = "橙色"
def __init__(self):
print("\n我是橘子")
apple = Apple() # 实例化Apple()类
apple.harvest(apple.color) # 在Apple()中调用harvest方法,并将Apple()的color变量传入
orange = Orange()
orange.harvest(orange.color) # 在Orange()中调用harvest方法,并将Orange()的color变量传入
执行结果:
我是苹果
水果是:红色的!
水果已经收获...
水果原来是绿色的!
我是橘子
水果是:橙色的!
水果已经收获...
水果原来是绿色的!
方法重写
基类(被继承的类)的成员都会被派生类(继承的新类)继承,当基类中的某个方法不完全适用于派生类时,就需要在派生类中重写父类的这个方法。
如上面的示例代码2,基类中定义的harvest()方法,无论派生类是什么水果都显示"水果…",如果想要针对不同水果给出不同的提示,可以在派生类中重写harvest()方法。例如,在创建派生类Orange()时,重写harvest()方法如下:
class Fruit:
color = '绿色'
def harvest(self, color):
print(f"水果是:{color}的!")
print("水果已经收获...")
print(f"水果原来是{Fruit.color}的!")
class Apple(Fruit):
color = "红色"
def __init__(self):
print("我是苹果")
class Orange(Fruit):
color = "橙色"
def __init__(self):
print("\n我是橘子")
def harvest(self, color): # 重写harvest
print(f"橘子是:{color}的!")
print("橘子已经收获...")
print(f"橘子原来是{Fruit.color}的!")
apple = Apple() # 实例化Apple()类
apple.harvest(apple.color) # 在Apple()中调用harvest方法,并将Apple()的color变量传入
orange = Orange()
orange.harvest(orange.color) # 在Orange()中调用harvest方法,并将Orange()的color变量传入
执行结果:
我是苹果
水果是:红色的!
水果已经收获...
水果原来是绿色的!
我是橘子
橘子是:橙色的!
橘子已经收获...
橘子原来是绿色的!
注意:如本类中和父类同时存在这个方法名称,将只会执行本类中的这个方法,不会调用父类的同名方法(包括__init__())
派生类中调用基类__init__()方法
在派生类中定义__init__()方法时,不会自动调用基类的__init__()方法,如下示例代码:
class Fruit:
def __init__(self, color="绿色"):
Fruit.color = color
def harvest(self):
print(f"水果原来是{Fruit.color}的!")
class Apple(Fruit):
def __init__(self):
print("我是苹果")
apple = Apple()
apple.harvest()
执行结果:
我是苹果
Traceback (most recent call last):
File "D:/xuexi/python/Demo.py", line 51, in <module>
apple.harvest()
File "D:/xuexi/python/Demo.py", line 41, in harvest
print(f"水果原来是{Fruit.color}的!")
AttributeError: type object 'Fruit' has no attribute 'color'
可以看到如上调用出现报错了,要让派生类调用基类的__init__()方法进行必要的初始化,需要在派生类使用super函数调用基类的__init__()方法
super().__init__() #调用积累的__init__()方法(注意缩进)
示例代码:
class Fruit: # 定义水果类(基类)
def __init__(self, color="绿色"):
Fruit.color = color # 定义类属性
def harvest(self, color):
print("水果是:" + color + "的!") # 输出的是形式参数color
print("水果已经收获……")
print("水果原来是:" + Fruit.color + "的!") # 输出的是类属性color
class Apple(Fruit): # 定义苹果类(派生类)
color = "红色"
def __init__(self):
print("我是苹果")
super().__init__()
class Aapodilla(Fruit): # 定义人参果类(派生类)
def __init__(self, color):
print("\n我是人参果")
super().__init__(color)
def harvest(self, color): # 重写harvest()方法的代码
print("人参果是:"+ color +"的!") # 输出的是形式参数color
print("人参果已经收获……")
print("人参果原来是:"+Fruit.color+"的!") # 输出的是类属性color
apple = Apple() # 创建类的实例(苹果)
apple.harvest(apple.color) # 调用基类的harvest()方法
sapodilla = Aapodilla("白色") # 创建类的实例(人参果)
sapodilla.harvest("金黄色带紫色条纹") # 调用基类的harvest()方法
执行结果:
我是苹果
水果是:红色的!
水果已经收获……
水果原来是:绿色的!
我是人参果
人参果是:金黄色带紫色条纹的!
人参果已经收获……
人参果原来是:白色的!
实践
示例代码1:
class Demo:
"""更换手机默认语言"""
def __init__(self, language='英语'):
Demo.language = language
print(f"智能手机默认的语言为{Demo.language}")
class Demo2(Demo):
def __init__(self, language='中文'):
super().__init__(language)
print("开始变更语言...")
def default(self, language):
print(f"已将智能手机默认的语言设置为{language}")
languages = Demo2()
languages.default("中文")
执行结果:
智能手机默认的语言为中文
开始变更语言...
已将智能手机默认的语言设置为中文
示例代码2:
class Demo3:
"""输出每月销售额"""
def __init__(self):
self.January = ("商品编号:T0001 商品名称:笔记本电脑",) # 使用元组是如果只有一个参数要加一个逗号,不然系统默认你括号中是一个普通字符串
self.February = ("商品编号:T0002 商品名称:华为荣耀", "商品编号:T0003 商品名称:iPad")
self.March = ()
self.April = ()
self.May = ()
self.June = ()
self.July = ()
self.August = ()
self.September = ()
self.October = ()
def get(self, month=1):
print(f"【{month}】月出售的商品有:")
if month == 1:
for i in self.January:
print(i)
elif month == 2:
for i in self.February:
print(i)
"""..."""
num = int(input("请输要查询的月份:"))
value = Demo3()
value.get(num)
执行结果:
请输要查询的月份:2
【2】月出售的商品有:
商品编号:T0002 商品名称:华为荣耀
商品编号:T0003 商品名称:iPad
Python继承、方法重写的更多相关文章
- Objective-c 类的继承 方法重写 方法重载
一.类的继承 Objective-c中类的继承与C++类似,不同的是Objective-c不支持多重继承,一个类只能有一个父类,单继承使Objective-c的继承关系很简单,易于管理程序. Obje ...
- 20面向对象三特征 之继承 方法重写 super
继承是:多个类有重复内容,把重复内容放到一个新类中,就可以通过extends关键词去让原来的类和新类产生继承关系,子类只能拿到父类一部分信息.通过extends关键词去指明类与类之间的关系,一个父类可 ...
- python 继承:重写、拓展(六)
1.继承:父类有的子类也有 2.多继承:若继承多个父类有相同的函数,则继承前面的函数,传递参数的个数也与继承的函数位置有关 3.超继承:针对继承一个父类使用,不仅有父类的特写同时也有自己的新特性 s ...
- python 父类方法重写
class Bird: def isWing(self): print("鸟有翅膀") def fly(self): print("鸟会飞") class Os ...
- PHP学习笔记5-类的继承/方法重写
更改Man.php文件名为People.php,加入代码: public function hi(){ return $this->_name.' say hi'; } 新建文件Man.php: ...
- 乐字节Java继承|方法重写、super和final关键字
大家好,乐字节的小乐又来了,上一篇是:乐字节Java|JavaBean.继承与权限修饰,也是属于Java继承的,今天继续Java继承. 一. 方法的重写 父类不满足子类的要求,按需改写.注意 方法签名 ...
- 04 Python的继承、方法重写、super()类、父类私密属性的调用
继承 A类继承B类,A即可获得B类的全部公共属性和方法(包括内置属性和方法).格式如:class A(B): class Animal: def sleep(self): print("zZ ...
- python类继承的重写和super
给已经存在的类添加新的行为,继承是非常好的实现方式.但是如果要改变行为呢?比如在Python继承扩展内置类,我们的contact类只允许一个名字和一个邮箱,但是如果要对某些人增加电话号码呢?这里可以通 ...
- Python继承、多继承、魔术方法
继承和多继承的概念和使用 super的用法 __str__ __repr__ __call__ 多继承方法解析顺序和Mix-in开发模式 魔术方法原理和作用 继承 定义类的时候,在类名后面的括号里填继 ...
随机推荐
- 【Convex Optimization (by Boyd) 学习笔记】Chapter 2 - Convex sets(1) 仿射集&凸集
I. 仿射凸集(Affine and convex sets) 1. 线与线段 假设\(R^n\)空间内两点\(x_1,x_2\, (x_1≠x_2)\),那么\(y=\theta x_1+(1-\t ...
- vue之router钩子函数
模块一:全局导航钩子函数 1.vue router.beforeEach(全局前置守卫) beforeEach的钩子函数,它是一个全局的before 钩子函数, (before each)意思是在 每 ...
- while(cin>>n1>>n2)
这里有2个点, 1. while(cin>>n)用到了强制类型转换 2. 强调输入遇到-1则退出,说明要一直看是否输入了-1,并记录下来 #include <iostream> ...
- requests库入门13-会话对象
会话对象可以在跨请求保持某些参数,会话对象有requests api的大部分方法,我理解会话对象就是一个资源共享池 使用requests.Session()可以创建会话对象的实例 还是以之前GitHu ...
- 利用URLConnection http协议实现webservice接口功能(附HttpUtil.java)
URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...
- python结合pyvmomi 监控esxi的磁盘等信息
1.安装python3.6.6 # 安装依赖,一定要安装,否则后面可能无法安装一些python插件 yum -y install zlib-devel bzip2-devel openssl-deve ...
- mysql 5.7 Group Replication
MySQL 组复制实现了基于复制协议的多主更新(单主模式). 复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务.但所有读写(RW)事务只有在冲突检测成功后才会提 ...
- 业务侧有大量timeout请求超时日志
故障背景:程序日志发现有程序请求数据库有大量的timeout请求故障时间:xxx~xxx 故障排查:排查应用服务器和数据库服务器网络和其它硬件监控没有断点,数据库监控请求数当时时间段几乎为0 故障分析 ...
- 洛谷P4389 付公主的背包 [生成函数,NTT]
传送门 同样是回过头来发现不会做了,要加深一下记忆. 思路 只要听说过生成函数的人相信第一眼都可以想到生成函数. 所以我们要求 \[ ans=\prod \sum_n x^{nV}=\prod \fr ...
- Java希尔排序算法
希尔排序就是对直接插入排序的一个优化.比如有这么一种情况:对一个无序数组进行从小到大的排序,但是数组的最后一个位置的数是最小的,我们要把它挪到第一个位置,其他位置的都要往后移动,要是这个数组非常大,那 ...