Python新式类与经典类

新式类

新式类是在创建的时候继承内置object对象(或者是从内置类型,如list,dict等),而经典类是直接声明的。

Python所有内置对象都源自object对象。解释器内置的object对象定义了一系列特殊的方法,用于实现对象的默认行为:

  •  __new__
  • __init__
  • __delattr__
  • __getattribute__
  • __setattr__
  • __hash__
  • __repr__
  • __str__
  • @staticmethod
  • @classmethod
  • __slots__
  • __getattribute__:所有属性和方法的访问操作都是通过__getattribute__完成
  • ...

新式类的MRO(Method Resolution Order, 方法解析顺序),采用的是从左到右,广度优先的方式进行查找。比如下面的代码,类A即为新式类,查找顺序为D->B->C->A,因此print D().name()调用的是类C的name方法,将输出字符C。

# -*- coding: utf8 -*-

class A(object):
    def name(self):
        return 'A'

class B(A):
    pass

class C(A):
    def name(self):
        return 'C'

class D(B, C):
    pass

if __name__ == '__main__':
    print D().name()

另外,新式类的类型是type,也就是对于上述代码执行type(A)将得到<type 'type'>。

经典类

经典类的MRO(Method Resolution Order, 方法解析顺序),方法和属性的查找链是按照从左到右,深度优先的方式进行查找。比如下面的代码,查找顺序为D->B->A->C,因此print D().name()调用的是类A的name方法,将输出字符A。经典类的类型是classobj,执行type(A)将得到<type 'classobj'>。

# -*- coding: utf8 -*-

class A():
    def name(self):
        return 'A'

class B(A):
    pass

class C(A):
    def name(self):
        return 'C'

class D(B, C):
    pass

if __name__ == '__main__':
    print D().name()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

「已注销」

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

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

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

打赏作者

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

抵扣说明:

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

余额充值