python旧式类和新式类

python2有经典类和新式类并存,具体写法分为:

class A(object):新式类

class A():旧式类

class A:旧式类

python3默认是新式类

有无object是判断旧式类和新式类的最大区别,新式类继承了object类。

 

新式类的MRO(method resolution order 基类搜索顺序)算法采用C3算法广度优先搜索,而旧式类的MRO算法是采用深度优先搜索。

在python2和python3定义类,测试他的类型时是这样:

#Python2

class A:

    pass

print(type(A))

output:




#Python3

class A(object):

    pass

print(type(A))

output:

 

另外旧式类的深度优先示例:

class A():

    def foo1(self):

          print("A")

class B(A):

    def foo2(self):
          pass

class C(A):
     def foo1(self):

          print("C")

class D(B, C):

    pass

d =D()

d.foo1()

output:

A

按照经典类的查找顺序从左到右深度优先的规则,在访问d.foo1()的时候,D这个类是没有的..那么往上查找,先找到B,里面没有,深度优先,访问A,找到了foo1(),所以这时候调用的是A的foo1(),从而导致C重写的foo1()被绕过

 

新式类是广度优先

class A(object):

    def foo1(self):

          print("A")

class B(object):

    def foo2(self):

          pass

class C(object):     #或者是class C(A):只要A是新式类的定义,那么继承类都是新式类

    def foo1(self):

          print("C")

class D(B, C):

    pass

d = D()

d.foo1()

output:

C

新式类和旧式类的不同还包括:

#举例
class A(object):
    pass

class B():
    pass

print(dir(A))
print(dir(B))
#查看旧式类和新式类都有哪些魔术方法

output:
新式类有:
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
旧式类有:
['__doc__', '__module__']

对于各种魔术方法的意义,附上参考链接:

https://blog.csdn.net/NightCharm/article/details/79357559

你可能感兴趣的:(python)