Python:新式类和旧式类

本文探讨了Python中的新式类和旧式类的区别,包括类实例类型的差异,如新式类统一了class和type的概念,旧式类没有;继承顺序的不同,新式类采用广度优先,旧式类深度优先;新式类的__slots__属性用于节省内存,以及新增的__getattribute__方法等。此外,还解释了实例方法的相似和不同之处。
摘要由CSDN通过智能技术生成
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 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值