1.介绍
Python2.1之前,只存在旧式类,从Python2.2开始,Python引入了新式类。
从定义形式上看,新式类和旧式类的区别:新式类在创建时继承了内置的object对象,而旧式类没有。
# 旧式类
class a:
pass
# 旧式类
class a1():
pass
# 新式类
class a2(object):
pass
print dir(a)
print dir(a1)
print dir(a2)
结果:
[’__doc__’, ‘__module__’]
[’__doc__’, ‘__module__’]
[’__class__’, ‘__delattr__’, ‘__dict__’, ‘__doc__’, ‘__format__’, ‘__getattribute__’, ‘__hash__’, ‘__init__’, ‘__module__’, ‘__new__’, ‘__reduce__’, ‘__reduce_ex__’, ‘__repr__’, ‘__setattr__’, ‘__sizeof__’, ‘__str__’, ‘__subclasshook__’, ‘__weakref__’]
从结果中可以看出,旧式类只有两个方法,而新式类则从object继承了很多的属性和方法。
- Python2中默认都是经典类,只有显式的继承了object才是新式类
- Python3中将经典类移除,默认都是新式类,不必显式的继承object类
2.区别
2.1 类实例类型的区别
- 在旧式类中class和type是不同的概念,例如x是一个类A的实例,则x.__class__的输出指向的是类A,而type(x)的输出是<type ‘instance’>.
- 在新式类中,class和type是统一的概念,x.__class__和type(x)指向的都是类A
例子:
# 旧式类
class a:
pass
# 旧式类
class a1():
pass
x = a()
print type(x)
print x.__class__
print '\n'
x1 = a1()
print type(x1)
print x1.__class__
print '\n'
# 新式类
class b(object):
pass
y = b()
print type(y)
print y.__class__
print '\n'
# 旧式类
class c(a):
pass
z = c()
print type(z)
print z.__class__
print '\n'
# 新式类
class d(b):
pass
w = d()
print type(w)
print w.__class__
print '\n'
结果:
<type ‘instance’>
__main__.a
<type ‘instance’>
__main__.a1
<class ‘__main__.b’>
<class ‘__main__.b’>
<type ‘instance’>
__main__.c
<class ‘__main__.d’>
<class ‘__main__.d’>
2.2 继承顺序的区别
- 旧式类的多继承属性搜索顺序:继承树上从左到右,深度优先的搜索方式
- 新式类多继承属性搜索顺序:从左到右,广度优先的方式
例子:
# 新式类
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