鸭子类型与多态
内容鸭子类型和多态笼统基类(abc模块)利用isinstance和type的区别类属性和实例属性类属性和实例属性查找挨次Python对象的自省机造super函数鸭子类型
多态的概念是应用于Java和C#那一类强类型语言中,而Python崇尚"鸭子类型"
动态语言挪用实例办法时不查抄类型,只要办法存在,参数准确,就能够挪用。那就是动态语言的“鸭子类型”,它其实不要求严酷的继承系统,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就能够被看做是鸭子。
a=[1,2,3] b=[2,3,4] c=(1,5,6) a.extend(c) print(a) a.extend(c) print(a)
多态
定义时的类型和运行时的类型纷歧样,就称为多态。
class Cat(object): def info(self): print("我是一只猫") class Dog(object): def info(self): print("我是一只狗") class Duck(object): def info(self): print("我是一只鸭") list=[Cat,Dog,Duck] #法式在运行到那一步是只把Cat,Dog,Duck当成变量 for animal in list: animal().info() #只要实例化挪用类办法的时候才会大白是一个类,那就暗示多态 笼统基类(abc模块) 笼统基类介绍
笼统基类(abstract base class,ABC):笼统基类就是类里定义了纯虚成员函数的类。纯虚函数只供给了接口,并没有详细实现。笼统基类不克不及被实例化(不克不及创建对象),凡是是做为基类供子类继承,子类中重写虚函数,实现详细的接口。
笼统基类就是定义各类办法而不做详细实现的类,任何继承自笼统基类的类必需实现那些办法,不然无法实例化。
笼统基类应用场景1.我们去查抄某个类中能否有某种办法from collections.abc import Sized class Demo(object): def __init__(self,li): self.li=li def __len__(self): return len(self.li) list=["C","python","Java"] d=Demo(list) print(len(d)) print(hasattr(d,"__len__")) #判断Demo中能否含有len办法 print(isinstance(d,Sized)) #判断d能否是Sized那个类 2.我们需要强调某个子类必需实现某些办法import abc class CacheBase(metaclass=abc.ABCMeta): def dele(self): pass @abc.abstractmethod def crea(self): pass class Redisbase(CacheBase): def crea(self): print("create") r=Redisbase() r.crea() type与isinstance区别type 不考虑 继承关系isinstance 考虑继承关系类属性与实例属性 根本查找挨次对象是能够向上查找的,所以能够拜候到类属性当对象本身有该实例属性时 ,则输出的是本身的类不克不及向下查找,所以只能拜候到类属性class Cat(object): meow=1 def __init__(self,a,b): self.a=a self.b=b cat=Cat(1,2) print(cat.meow) print(cat.a,cat.b) print(cat.meow) print(Cat.a) #向下查找时就会报错 print(cat.meow)# 相当于封拆 print(Cat.meow)#相当于笼盖 class Cat(object): meow=1 def __init__(self,a,b): self.a=a self.b=b self.meow="3" c=Cat(1,2) print(c.meow)#当对象该实例化属性的时候,就间接输出本身的 print(Cat.meow)#当对象本身没有该属性的时候才会向类向上查找 类属性与实例属性 根本查找挨次对象是能够向上查找的,所以能够拜候到类属性当对象本身有该实例属性时 ,则输出的是本身的类不克不及向下查找,所以只能拜候到类属性多继承查询挨次
继承关系如下,则属性查找挨次为?
现实上,python2.2(金典类)之前的算法:MRO算法,DFS(deep first search) 深度优先。
如下图,菱形继承,施行挨次若何?
在python2.2版本之后,引入BFS(广度优先)。
在python新式类,就引入了C3算法,通过className.__mro__来查看。
Python对象自省机造
自省是通过必然的机造查询到对象的内部构造
Python中比力常见的自省(introspection)机造(函数用法)有: dir(),type(), hasattr(), isinstance(),通过那些函数,我们可以在法式运行时得知对象的类型,判断对象能否存在某个属性,拜候对象的属性。
class Prepon(object): name="白晓吧" class Student(Prepon): def __init__(self,school_name): self.school_name=school_name hty=Student("xiao") print(hty.__dict__)#返回当前对象的属性 print(dir(hty)) #返回所有的成员,考虑继承