面向对象三大特性之继承
1:继承,顾名思义就是子代继承父辈的一些东西,在程序中也就是子类继承父类的属性和方法。
1 #Author : Kelvin 2 #Date : 2019/1/16 18:57 3 4 class Father: 5 money=1000 6 7 def __init__(self,name): 8 print("父类的init方法...") 9 self.name=name 10 11 def teach(self): 12 print("%s 正在教儿子学习..."%self.name) 13 14 class Son(Father): 15 pass 16 17 18 s=Son("kelvin") 19 print(s) 20 #>>>: 父类的init方法... 21 #>>>: <__main__.Son object at 0x0000018B1A1AEEB8> 22 s.teach() 23 # >>>: kelvin 正在教儿子学习...
可见,即使Son类没有定义init方法,money属性和teach方法,但是由于Son类继承了Father类,所以在实例化Son时可以使用父类的属性值和方法。
误区:如果子类存在与父类同名的属性和方法,并不是覆盖了从父类继承的属性。因为子类会先从本类开始找对应方法,如果没有再去父类调用。
归一化设计(接口继承):
使用继承的最大作用就是定义一种规范。让继承者按照规范进行书写代码。
第一种:普通类继承。缺点:不能限制子类根据父类的规范定义函数。
1 #Author : Kelvin 2 #Date : 2019/1/16 19:53 3 4 class Basic(): 5 6 def eat(self): 7 pass 8 9 def drink(self): 10 pass 11 12 class People(Basic): 13 def __init__(self,name): 14 self.name=name 15 def eat(self): 16 print("%s吃饭"%self.name) 17 def drink(self): 18 print("%s喝水"%self.name) 19 20 class Cat(Basic): 21 def __init__(self,name): 22 self.name=name 23 def eat(self): 24 print("%s吃饭"%self.name) 25 26 c=Cat("猫咪") 27 c.eat() 28 c.drink()
很明显,代码可以执行,说明子类即使不按照父类定义的标准执行,也不会报错。很明显父类不能起到规定的作用。接下来可以使用这种实现:
1 #Author : Kelvin 2 #Date : 2019/1/16 19:53 3 import abc 4 class Basic(metaclass=abc.ABCMeta): 5 @abc.abstractmethod 6 def eat(self): 7 pass 8 @abc.abstractmethod 9 def drink(self): 10 pass 11 12 class People(Basic): 13 def __init__(self,name): 14 self.name=name 15 def eat(self): 16 print("%s吃饭"%self.name) 17 def drink(self): 18 print("%s喝水"%self.name) 19 20 class Cat(Basic): 21 def __init__(self,name): 22 self.name=name 23 def eat(self): 24 print("%s吃饭"%self.name) 25 26 c=Cat("猫咪") 27 c.eat() 28 c.drink()
此时,由于Cat类继承了Basic,但是由于Basic类做了限制,继承Basic类必须实现所有Basic中的方法,但是Cat中只实现了部分方法,因此程序报错。
如果在子类中定义了和父类同名的属性和成员方法时,如何才能调用父类属性和方法呢?
1 #Author : Kelvin 2 #Date : 2019/1/16 20:45 3 4 class way: 5 def __init__(self,name,speed): 6 self.name=name 7 self.speed=speed 8 def run(self): 9 print("所有交通工具!") 10 11 class subway(way): 12 def __init__(self,name,speed,line): 13 # way.__init__(self,name,speed) 14 # super(subway, self).__init__() 15 super().__init__(name,speed) 16 self.line=line 17 def run(self): 18 # way.run(self) 19 # super(subway, self).run() 20 super().run() 21 print("地铁交通工具!") 22 23 s=subway("徐州地铁","10km/min","13号线路") 24 s.run()
注释的两种方式可以实现相同效果!
分类:
[编程语言] Python
标签:
Python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~