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