python中经典类和新式类的区别

tech2023-06-03  111

python中经典类和新式类的区别

旧式类

在Python 2及以前的版本中,不由任意内置类型派生出的类,则称之为“经典类”。

反之,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性;

新式类

python在2.2版本中引入了descriptor功能,也正是基于这个功能实现了新式类(new-styel class)的对象模型, 同时解决了之前版本中经典类(classic class)中多重继承中的MRO(Method Resolution Order)的问题, 同时引入了一些新的概念,比如classmethod, staticmethod, super,Property等,这些新功能都是基于descriptor 而实现的。

因为Python3中所有的类都是新式,这个问题就不复存在了

区别

经典类遵循深度优先的规则,新式类遵循广度优先的规则。

class A(object):

    def __init__(self):

        print('A')

 

class B(A):

pass

 

class C(A):

    def __init__(self):

        print('C')

 

class D(B,C):

    pass

  

r1 = D()

在新式类中,D是继承BC的,按照顺序,首先去找B,如果在B里面能找到实例化对象,便继承B,不再往别的地方寻找,如果没有,就会接着找C,而不是找B的父亲A

但是在经典类中,如果B中找不到,它会优先考虑B的父亲A,而不是C

MRO

Python的MRO即Method Resolution Order(方法解析顺序),也就是在Python中的类的继承顺序是怎样的。在Python2.3之前,MRO的实现是基于DFS的,而在Python2.3以后MRO的实现是基于C3算法。C3算法最早被提出是用于Lisp的,应用在Python中是为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题。本地优先级:指声明时父类的顺序,比如C(A,B),如果访问C类对象属性时,应该根据声明顺序,优先查找A类,然后再查找B类。单调性:如果在C的解析顺序中,A排在B的前面,那么在C的所有子类里,也必须满足这个顺序。

一个类的 MRO 列表就是合并所有父类的 MRO 列表,并遵循以下三条原则:

子类永远在父类前面

如果有多个父类,会根据它们在列表中的顺序被检查

如果对下一个类存在两个合法的选择,选择第一个父类

内置的object对象

内置的object对象是所有内置,object对象定义了一系列特殊的方法实现所有对象的默认行为。

__new__ , __init__ 方法 这两个方法是用来创建object的子类对象,静态方法 __new__()用来创建类的实例,然后再调用 __init__() 来初始化实例。  __delattr__ , __getattribute__ , __setattr__ 方法 对象使用这些方法来处理属性的访问  __hash__ , __repr__ , __str__ 方法 print(someobj) 会调用 someobj.__str__() , 如果 __str__ 没有定义,则会调用 someobj.__repr__()

str()和__repr__()的区别:

默认的实现是没有任何作用的__repr__的目标是对象信息唯一性__str__的目标是对象信息的可读性容器对象的__str__一般使用的是对象元素的__repr__如果重新定义了__repr__,而没有定义__str__,则默认调用__str__时,调用的是__repr__也就是说好的编程习惯是每一个类都需要重写一个__repr__方法,用于提供对象的可读信息,而重写__str__方法是可选的。实现__str__方法,一般是需要更加好看的打印效果,比如你要制作一个报表的时候等。

可以允许object的子类重载这些方法,或者添加新的方法。

静态方法

静态方法可以被类或者实例调用,它没有常规方法的行为(比如绑定,非绑定,默认的第一个self参数),当有一堆函数仅仅是为了一个类写的时候,采用静态方法声明在类的内部,可以提供行为上的一致性。创建静态方法使用装饰符@staticmethod进行创建。

不管是 类调用,还是实例调用静态方法,都是指向同一个函数对象。

类方法

也是可以通过类和它的实例进行调用,不过它是有默认第一个参数,叫做是类对象,一般被 命名为cls,当然你也可以命名为其它名字,这样就你可以调用类对象的一些操作。类方法使用装饰符@classmethod创建

 

 

 

 

 

 

 

 

 

 

 

 

 

最新回复(0)