[python] 新式类与经典类的区别
在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性;反之,即不由任意内置类型派生出的类,则称之为“经典类”。
Python2.x中,默认都是经典类,只有显式继承了object才是新式类,即:
class Person(object):pass 新式类写法
class Person():pass 经典类写法
class Person:pass 经典类写法
“新式类”和“经典类”的区分在Python 3之后就已经不存在,在Python 3.x之后的版本,因为所有的类都派生自内置类型object(即使没有显示的继承object类型),即所有的类都是“新式类”。
在Python 3.x中取消了经典类,默认都是新式类,并且不必显式的继承object,也就是说:
class Person(object):pass
class Person():pass
class Person:pass
三种写法并无区别,推荐第一种
官方文档 https://www.python.org/doc/newstyle/
继承搜索的顺序发生了改变,经典类多继承属性搜索顺序: 先深入继承树左侧,再返回,开始找右侧;新式类多继承属性搜索顺序: 先水平搜索,然后再向上移动
# -*- coding:utf-8 -*-
class A(object):
"""
新式类
作为所有类的基类
"""
def foo(self):
print "class A"
class A1():
"""
经典类
作为所有类的基类
"""
def foo(self):
print "class A1"
class C(A):
pass
class C1(A1):
pass
class D(A):
def foo(self):
print "class D"
class D1(A1):
def foo(self):
print "class D1"
class E(C, D):
pass
class E1(C1, D1):
pass
e = E()
e.foo()
e1 = E1()
e1.foo()
输出
class D
class A1
因为A新式类,对于继承A类都是新式类,首先要查找类E中是否有foo(),如果没有则按顺序查找C->D->A。它是一种广度优先查找方式。
因为A1经典类,对于继承A1类都是经典类,首先要查找类E1中是否有foo(),如果没有则按顺序查找C1->A1->D1。它是一种深度优先查找方式。