python面向对象高级和应用
1.1mro和c3算法
通过mro()获取当前类的继承关系(找成员的顺序)
示例一
mro(A)=[A]+merge(mro(B),mro(c))
=[A]+merge([B],[C],[B,C])
=[A]+[B,C]
=[A,B,C]
print( A.mro() ) # [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>]
print( A.__mro__ ) # (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)
示例二
mro(A)=[A]+merge(mro(B)+mro(c),[B,C])
=[A]+merge([B],[C,D],[B,C])
=[A]+[B,C,D]
[A,B,C,D]
print( A.mro() ) # [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>]
示例三
mro(A)=[A]+merge(mro(B)+mro(C),[B,C])
=[A]+merge([B,D]+[C],[B,C])
=[A]+[B,D,C]
=[A,B,D,C]
print(A.mro()) # [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.C'>, <class 'object'>]
示例四
mro(A)=[A]+merge(mro(B)+mro(C),[B,C])
=[A]+merge([B,D],[C,D],[B,C])
=[A]+[B,C,D]
=[A,B,C,D]
print(A.mro()) # [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>]
示例五
mro(A)=[A]+merge(mro(B)+mro(C)+mro(P),[B,C,P])
=[A]+merge(mro(B)+mro(C)+mro(P),[B,C,P])
mro(B)=[B]+merge(mro(D)+mro(E),[D,E])
mro(D)=[D]+merge(mro(G)+mro(H),[G,H])
=[D]+merge([G],[H,K],[G,H])
=[D,G,H,K]
mro(B)=[B]+merge(mro(D)+mro(E),[D,E])
=[B]+merge([D,G,H,K]+[E,M],[D,E])
=[B]+[D,G,H,K,E,M]
=[B,D,G,H,K,E,M]
mro(C)=[C]+merge(mro(E)+mro(F),[E,F])
=[C]+merge([E,M]+[F,M,N],[E,F])
=[C]+[E,F,M,N]
=[C,E,F,M,N]
mro(A)=[A]+merge(mro(B)+mro(C)+mro(P),[B,C,P])
=[A]+merge([M]+[F,M,N]+[P],[P])
=[A]+[B,D,G,H,K,C,E,F,M,N,P]
=[A,B,D,G,H,K,C,E,F,M,N,P]
print(A.mro()) # 简写为:A -> B -> D -> G -> H -> K -> C -> E -> F -> M -> N -> P -> object
一句话搞定继承关系
从左到右,深度优先,大小钻石,留住顶端
1.2 py2和py3区别(了解)
- py2
- 经典类,未继承object类型【从左到右,深度优先,大小钻石,不留顶端】
- 新式类(py2之后开始支持),直接或间接继承object类型【从左到右,深度优先,大小钻石,留住顶端–c3算法】
- py3
- 新式类,丢弃了经典类只保留了新式类【从左到右,深度优先,大小钻石,留住顶端–c3算法】
2.内置函数补充
-
classmethod,staticmethod,property
-
callable,是否可在后面加括号执行
-
函数
def func(): pass callable(func)#True
-
类
class Foo(object): pass callable(Foo)#True
-
类具有
__call__
方法的对象class Foo(object): pass a=Foo() #类中没有call方法,所以对象中没有 callable(a)#False class Foo(object): def __call__(self,*args,**kwargs): pass a=Foo() callable(a) #True
#handler可以是:函数,类,具有call方法的对象 def dO_something(handler): pass
-
-
super,按照mro继承关系向上找成员
class Top(object): def message(self,num): print('Top',num) class Base(Top): pass class Foo(Base): #找到自己 def message(self,num): print("Foo",num) #找父类的message super().message(num+100) a=Foo() a.message(1) # Foo 1 # Top 101
应用场景:在一个类上扩展功能,用super
class MyDict(dict): def get(slef,k): print("自定义功能") return super().get(k)
-
type,获取一个对象的类型
class Foo(object): pass a=Foo() type(a)==Foo#True
-
isinstance,判断对象是否是某个类或其子类的实例
class Base(object): pass class Foo(Base): pass a=Foo() isinstance(a,Foo)#True isinstance(a,Base)#True
应用案例
class Animal(object): def run(self): pass class Dog(Animal): pass class Cat(Animal): pass data_list=[ 'wxy', Dog(), Cat(), ] #方式一 for i in data_list: if type(i)==Cat: i.run() elif type(i)==Dog: i.run() else: pass #方式二 # for i in data_list: # if isinstance(i,Animal): # i.run() # else: # pass
-
issubclass,判断类是否是某个类的子孙类
class Top(object): pass class Base(Top): pass class Foo(Base): pass issubclass(Foo,Base)#True issubclass(Foo,Top)#True
https://www.luffycity.com/