什么是经典类和新式类
经典类:是python2.2之前的,到了python2.7依旧支持,python3.x之后只支持新式类了
新式类:从python2.2之后至今都在使用,现在默认都是新式类
新式类比经典类有什么优点:
原因在于经典类在类多重继承的时候是采用从左到右深度优先
原则匹配方法的,而新式类是采用C3算法
(不同于广度优先)进行匹配的,经典类最容易出现的就是子类越过父类的方法
在多重继承中,我们可以测试一下搜索成员的顺序:
新式类的经典类的继承:
class A:
def __init__(self):
print("i am A")
self.can = True
def sing(self):
if can:
print("a is singing")
class B(A):
def __init__(self):
print("i am B")
def eat(self):
print("b is eating")
h = B()
h.eat() # 正确执行
h.sing() # 报错,因为A的__init__被B的__init__覆盖了,就没有can这个成员,所以报can不存在
要解决上面这种情况
方法一:我们很多人都用过,但是这个方法其实不太好
class A:
def __init__(self):
print("i am A")
self.can = True
def sing(self):
if can:
print("a is singing")
class B(A):
def __init__(self):
A.__init__(self)
print("i am B")
def eat(self):
print("b is eating")
h = B()
h.eat() # 正确执行
h.sing() # 正确执行
方法二:用super
class A:
def __init__(self):
print("i am A")
self.can = True
def sing(self):
if can:
print("a is singing")
class B(A):
def __init__(self):
super(B,self).__init__()
print("i am B")
def eat(self):
print("b is eating")
h = B()
h.eat() # 正确执行
h.sing() # 正确执行
按类名访问
就相当于C语言之前的GOTO
语句...乱跳,然后再用super
按顺序访问..就有问题了
所以建议就是要么一直用super
,要么一直用按照类名访问
检验一个类是否为新式类:
issubclass(classname,object),True则为新式类,False则不是新式类