继承

在编写类时,并不是每次都要从空白开始。当要编写的类和另一个已经存在的类之间存在一定的继承关系时,就可以通过继承来达到代码重用的目的,提高开发效率。

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

最新文章

  1. Python之路【第十八篇】Django小项目简单BBS论坛部分内容知识点
  2. Java 邮件发送
  3. 每日英语:A New Way to Learn Chinese
  4. 【css】ie6 和 ie7 下 position 与 overflow 的问题
  5. RPC调用框架比较分析
  6. JSON与JAVA数据的相互转换
  7. oracle 存储过程和函数例子 --2
  8. codeforces 607B. Zuma 区间dp
  9. wireshark删除filters记录
  10. 获取listboxitem在ListBox中的index并转换成abcd
  11. 8.Hibernate的多对多关联映射
  12. Android面试经验1
  13. rsync (windows 服务端,linux客户端)将windows上的数据同步到linux服务器,反之也可
  14. ionic3-ng4学习见闻--(轮播图完美方案)
  15. SVD分解 解齐次线性方程组
  16. CodeForces #549 Div.2 D. The Beatles
  17. Ubuntu开启或重启ssh服务
  18. CrawlSpider爬取拉钩
  19. python写service时全局变量问题
  20. (转)Java中equals和==、hashcode的区别

热门文章

  1. python 08
  2. Spark架构与作业执行流程简介
  3. html超文本标记语言基础一
  4. hibernate 嵌套事务
  5. OGG-01168
  6. linux 终端命令行的快捷键列表
  7. mac环境下支持PHP调试工具xdebug,phpstorm监听
  8. 记录一下putty的pscp的用法【转】
  9. &lt;pre&gt;标签的基本样式设置
  10. 使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页