python 继承与抽象
继承
【一】什么是继承?
继承是一种创建新类的方式,新建的类可以继承一个或多个父类,父类可称为基类或者超类,新建的类称为派生类或子类。子类会“”遗传”父类的属性,从而解决代码重用问题
class School:
school='希望小学'
def __init__(self,name,age):
self.name=name
self.age=age
def introduce(self):
print('我是%s,我在%s上学。 '%(self.name,self.school))
class Animals(School):
def animals(self):
print(f'the animal is zebra')
class student(School):
def read(self):
print('Students are reading.')
student1=student('张三',10)
print(student1.school)
student1.introduce()
#希望小学
#我是张三,我在希望小学上学。
【二】类的特殊方法__ dict__
#查看一个继承的父类
print(student.__base__) <class '__main__.School'>
查看所有继承的父类
print(student.__bases__)
#(<class '__main__.School'>, <class '__main__.Animals'>)
【三】经典类和新式类
-
Python2区分经典类和新式类
在python2中,没有显式的继承object类的类,以及该类的子类,都是经典类
在python2中,显式地声明继承object的类,以及该类的子类,都是新式类
-
Python3都是新式类
在python3中,无论是否继承object,都默认继承object,即python3中所有类均为新式类
【四】属性查找顺序
- 属性查找顺序
继承的顺序肯定是从上至下继承
属性查找肯定是从下至上查找
class Foo:
def f1(self):
print('Foo.f1')
# 【2】自己没有就会来到父类里面找,找到了 f2
def f2(self):
print(self) # <__main__.Bar object at 0x000002439F6A2E10>
# 执行 Foo.f2
print('Foo.f2')
# 【3】谁调用的我,那我这个self就是谁
# Bar() ---> 调用的 f2 ---> self 就是 Bar 的对象
self.f1()
class Bar(Foo):
# 【4】找打了 自己的 f1
def f1(self):
print('Bar.f1')
# 实例化类得到对象
b = Bar()
# 【1】首先 肯定是没有 f2
b.f2()
#<__main__.Bar object at 0x000002B270D9BA60>
Foo.f2
Bar.f1
【五】隐藏属性
- 隐藏属性 : 隐藏给当前类,除了当前类,其他继承的子类均不能找到我隐藏的属性
class Foo:
# 变形为_Foo__fa
def __f1(self):
print('Foo.f1')
def f2(self):
print('Foo.f2')
# 变形为self._Foo__fa,因而只会调用自己所在的类中的方法
# _Foo__f1
self.__f1()
#
self._Bar__f1()
class Bar(Foo):
# 变形为_Bar__f1
def __f1(self):
print('Bar.f1')
# _Bar__f1
b = Bar()
# 在父类中找到f2方法,进而调用b._Foo__f1()方法,同样是在父类中找到该方法
b.f2()
#Foo.f2
#Foo.f1
#Bar.f1
【六】深度优先和广度优先
(1)深度优先
- 当类是经典类(python2)时,多继承情况下,在查找属性不存在时,会按照深度优先的方式查找下去
(2)广度优先
- 当类是新式类python3时,多继承情况下,在查找属性不存在时,会按照广度优先的方式查找下去
class A(object):
def test(self):
print('from A')
class B(A):
def test(self):
print('from B')
class C(A):
def test(self):
print('from C')
class D(B):
def test(self):
print('from D')
class E(C):
def test(self):
print('from E')
class F(D, E):
# def test(self):
# print('from F')
pass
f1 = F()
f1.test()
# 只有新式才有这个属性可以查看线性列表,经典类没有这个属性
print(F.__mro__)
# 新式类继承顺序:F->D->B->E->C->A
# 经典类继承顺序:F->D->B->A->E->C
# python3中统一都是新式类
# pyhon2中才分新式类与经典类
合集:
python高级
, python 面向对象
标签:
python进阶
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异