[python] 新式类与经典类的区别

本文详细解析了Python2中经典类与新式类的区别,包括它们的定义、特性以及多继承下属性搜索顺序的不同。在Python3中,所有类默认为新式类,不再区分经典类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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.youkuaiyun.com/u010066807/article/details/46896835

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Moke丶青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值