title: Classic-And-Old-Class
date: 2017-02-24 14:58:57
tags: Python
我比较崇尚新兴的东西,所以一直都在使用Python3,但无奈大部分生产环境都是Python2.x。
旧式类
旧式类是为了保证向后兼容而在2.1中引进的类。
他通过非继承的直接定义
class OldClass:
pass
或者继承自旧式类来创建
class OldChild(OldMather, OldFather):
pass
新式类
新式类通过继承自object或者type
class NewClass(object):
pass
class NewClass2(object):
pass
或者继承自其它新式类创建
class NewChild(NewParent):
pass
区别
新式类可以使用descriptor
关于描述符又是一个内容很多的东西,之后单独开篇讲。
新式类可以通过class获取自身类型:type
In [13]: class Test:
...: pass
...:
In [14]: class Test1(object):
...: pass
...:
In [15]: t1 = Test()
In [16]: t2 = Test1()
In [17]: t1.__class__
Out[17]: <class __main__.Test at 0x10c314ae0>
In [18]: t2.__class__
Out[18]: __main__.Test1
In [19]: type(t1)
Out[19]: instance
In [20]: type(t2)
Out[20]: __main__.Test1
继承的搜索顺序不同,旧式类为深度优先,
Classic Class:
In [24]: class Base:
...: def hi(self):
...: print("I am base")
...:
In [25]: class A(Base):
...: pass
...:
In [26]: class B(Base):
...: def hi(self):
...: print("I am B")
...:
In [27]: class C(A,B):
...: pass
...:
In [29]: c = C()
In [30]: c.hi()
I am base
New Class
In [31]: class NewBase:
...: def hi(self):
...: print("I am Base")
...:
In [32]: class NewBase(object):
...: def hi(self):
...: print("I am Base")
...:
In [33]: class NewA(NewBase):
...: pass
...:
In [34]: class NewB(NewBase):
...: def hi(self):
...: print("I am NB")
...:
In [35]: class NewC(NewA, NewB):
...: pass
...:
In [36]: newc = NewC()
In [37]: newc.hi()
I am NB
其中两种类的检索顺序为:
新式类:
先在同层进行检索,再深入进行,比较像BFS。
旧式类:
验证继承树向上,DFS。
结论
相比之下, classic class
没有任何优势,甚至像__slot__
这种Python中的Magic Method
都无法使用。旧式类在3.x后被淘汰,大概也是这个原因。