Classic-And-Old-Class


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

其中两种类的检索顺序为:
新式类:
newclass
先在同层进行检索,再深入进行,比较像BFS。

旧式类:
oldclass
验证继承树向上,DFS。

结论

相比之下, classic class没有任何优势,甚至像__slot__这种Python中的Magic Method都无法使用。旧式类在3.x后被淘汰,大概也是这个原因。