鸭子类型和多态(鸭子类型和多态有关吗英语)

admin|
118


鸭子类型与多态

内容鸭子类型和多态笼统基类(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)) #返回所有的成员,考虑继承