Python类的封装、继承、抽象、多态
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Python类的封装、继承、抽象、多态
把类的属性与⽅法封装起来,做⾃⼰调⽤(隐藏数据和⽅法)和别⼈调⽤(开放数据和⽅法)
单向继承:像⼀根绳上的蚂蚱⼀样,A继承B,B继承C,C继承D,即class D: class C(D): class B(C): class A(B):
多(向)继承:类A继承B、C、D等多个类的特性,即class A(B,C,D)
经典类:没有继承object类及其⼦⼦孙孙类的类,python2中存在,深度优先
新式类:继承了object类及其⼦⼦孙孙类的类,python3中都是这种,⼴度优先
深度优先:继承了多个类的classA,在调⽤了⼀个A中没有的⽅法时,第⼀次就查找⾄最终的⼀个类
⼴度优先:继承了多个类的classA,在调⽤了⼀个A中没有的⽅法时,最后⼀次才查找⾄最终的⼀个类
mro
类查找属性或⽅法时的顺序,按照产⽣对象的类的mro列表中所列的顺序查找,mro列表使⽤类名.__mro__或类名.mro()查看 如:class A(B): print(A.__mro__) 或 print(A.mro())
如果继承了多个类,⽽这⼏个⽗类中⼜都有相同的⽅法,则从mro列表中左边的开始查找。
从⽗类中调⽤⽅法,在⽗类中查找⽅法的顺序,按照mro列表中的顺序。
单继承类中,依次向上查找,
多继承类中,按照mro列表中⽗类的顺序进⾏查找
只能被继承,不能被实例化的类,多⽤于定义某种⽅法和属性,为多态提供基础
import abc
class Animal(metaclass=abc.ABCMeta): # 定义⼀个抽象类
@abc.abstractmethod # 定义⼀个抽象⽅法
def speak(self): pass
@abc.abstractmethod
def login(self):pass
接上例:
class People(Animal):
def speak(self):
# print('嗷嗷嗷')
pass
def login(self):
pass
class Pig(Animal):
def speak(self):
print('哼哼哼')
obj = People()
obj1 = Pig()
def animal(animal): # 定义⼀个函数,注意这是⼀个函数,不是⼀个类,函数的参数,是⼀个对象 return animal.speak() # 调⽤并返回对象的⽅法。