zoukankan      html  css  js  c++  java
  • 新式类和经典类

    创建方法上,新式类继承 object,或者说在创建的时候内置object对象。 经典类是直接声明的。

    一个关键的区别就是新式类能够从python的内置类型中继承,而经典类不行。

    新式类内置的object 对象是所有内置,通过其来实现所有对象的默认行为:

    newinit方法,静态方法new创建类的实例,然后通过init初始化类的实例

    delattr, getattribute, setattr方法 用来处理属性的访问

    str()和repr() ,默认的实现的没有作用的,str的目标是对象的可读性,repr是对象信息的唯一性,容器类型的str一般使用的对象元素的repr,如果定义了repr,再调用str时调用的其实是repr。

    可以用重载这些方法,或者添加新的方法。

    新式类提供了两种类型的方法,静态方法和类方法,在诸多新式类的特性中,只有类方法和经典类中的功能功能是完全一样的。

    新式类除了拥有经典类的全部特性之外,还有一些新的特性。比如init发生了变化,新增了静态方法new。可以用new 方法完成单例模式,默认是静态方法,无需声明。

    新式类的实例也具有新的特性。比如它拥有Property功能,该功能会对属性的访问方式产生影响;还有slots新属性,该属性会对生成子类实例产生影响;还添加了一个新的方法getattribute,比原有的getattr更加通用。

    slots是控制相应的实例对象不生成dict空间,虽然访问不到dict属性了,但是节省了一笔内存,当类拥有海量实例时,slots就能派上用场了。slots的功能只影响定义它的类,因此,子类需要重新定义slots才能有它的功能。父类也同理。在slots的元祖中添加dict ,weakfer弱引用,就可以重新使用这两个功能了。

    对新式类的实例来说,所有属性和方法的访问操作都是通过getattribute完成,这是由object基类实现的。如果有特殊的要求,可以重载getattribute方法,

    mro多继承关系:

    在经典对象模型中,方法和属性的查找链是按照从左到右,深度优先的方式进行查找。新的对象模型采用的是从左到右,广度优先的方式进行查找。

    super 超对象继承,当我们使用超对象调用父类的方法时,能保证只被运行一次:super()可以看成是更加安全调用父类方法的一种新方式。

  • 相关阅读:
    贵有恒
    二叉树的中序遍历
    001.3或5的倍数
    静态成员的语法总结及应用-单例模式
    力扣42题(接雨水)
    算法笔记之二分查找
    素数筛算法之寻找每个数的最小素因子
    素数筛的算法感悟
    一维数组的逆序存放问题
    关于c++入门的几个基本代码之求和
  • 原文地址:https://www.cnblogs.com/wang-kai-1994/p/10374938.html
Copyright © 2011-2022 走看看