Python 2.x中默認(rèn)都是經(jīng)典類(lèi),只有顯式繼承了object才是新式類(lèi)
Python 3.x中默認(rèn)都是新式類(lèi),不必顯式的繼承object
當(dāng)類(lèi)是經(jīng)典類(lèi)時(shí),多繼承情況下,會(huì)按照深度優(yōu)先方式查找
當(dāng)類(lèi)是新式類(lèi)時(shí),多繼承情況下,會(huì)按照廣度優(yōu)先方式查找
- 寫(xiě)法不一樣
class A:
pass
class B(object):
pass
- 在多繼承中,新式類(lèi)采用廣度優(yōu)先搜索,而經(jīng)典類(lèi)是采用深度優(yōu)先搜索。
# 經(jīng)典類(lèi)例子
class A:
def __init__(self):
print 'This is A'
def save(self):
print 'save method from A'
class B (A):
def __init__(self):
print 'this is B'
class C (A):
def __init__(self):
print 'this is C'
def save(self):
print 'save mothod from C'
class D(B,C):
def __init__(self):
print 'this is D'
d=D()
d.save()
# 輸出結(jié)果:經(jīng)典類(lèi)的搜索順序是D->B->A,是一種深度優(yōu)先查找方式
this is D
save method from A
# 新式類(lèi)例子:
class A(object):
def __init__(self):
print 'This is A'
def save(self):
print 'save method from A'
class B (A):
def __init__(self):
print 'this is B'
class C (A):
def __init__(self):
print 'this is C'
def save(self):
print 'save mothod from C'
class D(B,C):
def __init__(self):
print 'this is D'
d=D()
d.save()
# 運(yùn)行結(jié)果:新式類(lèi)的搜索順序是D->B->C->A,是一種廣度優(yōu)先查找方式
this is D
save mothod from C
- 新式類(lèi)新增
- 新式類(lèi)對(duì)象可以直接通過(guò)
__class__屬性獲取自身類(lèi)型:type - 新式類(lèi)增加了
__getattribute__方法 - 新式類(lèi)增加了
__slots__內(nèi)置屬性, 可以把實(shí)例屬性的種類(lèi)鎖定到__slots__規(guī)定的范圍之中。
class Person(object): __slots__ = ('name', 'age') #只允許Person擁有name和age屬性 def __init__(self): self.name='aline' self.age=20 self.sex='female' person=Person() # 運(yùn)行結(jié)果:報(bào)錯(cuò) AttributeError: 'Person' object has no attribute 'sex' - 新式類(lèi)對(duì)象可以直接通過(guò)