[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。它是一种深度优先查找方式。

 

 

 

 

https://blog.csdn.net/u010066807/article/details/46896835

posted @ 2018-11-16 18:09  Moke丶青  阅读(125)  评论(0编辑  收藏  举报