zoukankan      html  css  js  c++  java
  • Python学习————魔法方法

    Python中的魔法方法

    1._init_:

    初始化函数,在创建实例对象为其赋值时使用,在__new__之后,__init__必须至少有一个参数self,
    就是这个__new__返回的实例,__init__是在__new__的基础上可以完成一些其它初始化的动作,
    __init__不需要返回值。
    

    img

    2._new_:

    __new__ 是用来构造函数,创建并返回一个实例对象,调用__new__就会产生一个对象,但需要注意的是:只有继承自object的新式类才会有__new__方法,并且__new__至少要有一个参数,用来代表实例化的类,这个参数的实例化则是由python解释器自动提供的,并且__new__必须要有返回值,返回实例化出来的实例,同时也可以return父类__new__出来的实例或者直接object的__new__出来的实例
    

    img

    img

    从运行结果看__new__中的参数cls 和B的id是相同的,表明__new__中默认的参数cls就是B类本身,二在return的时候,并没有正确的返回当前cls的实例,而是返回了其父类A的实例,因此__init__方法并没有被调用,此时__new__虽然是在写B类中的,但其创建并返回的是一个A的实例对象
    

    当__new__返回正确的参数

    img

    img

    当__new__正确返回其当前类cls的实例对象时,__init__被调用到了,此时创建并返回的是一个B类的实例对象
    

    3_class_:

    img

    img

    我们可以通过__class__ 来获得已知对象的类(对象.__class__)
    __class__ 可以使用在:
    (当一个类中的某个成员变量是所有的该类的对象的公共变量时)
    

    img

    img

    从运行结果看,虽然a和b是两个不同的A类的实例对象,但采用了__class__之后,
    分别调用两个对象的addcount方法后,获取到的对象的count属性确实不断地累加的,此时
    self.__class__.count不再是单纯的某个对象的私有属性,而是类的所有实例对象的共有属性,它相当于self.A.count,若self.__class__.count += 1 变为self.count += 1此时__class__的效果就十分明显了
    

    img

    img

    4._str_:

    将对象转换成字符串 str(对象)测试的时候,打印对象的信息,__str__方法必须要
    return一个字符串类型的返回值,作为对实例对象的字符串描述,__str__实际上是
    被print函数默认调用的,当要Print(实例对象)时,默认调用__str__方法,将其
    字符串描述返回。如果不是要用str()函数转换,当你打印一个类的时候,那么print
    首先调用的就是类里面的定义的__str__
    

    img

    img

    5._repr_:

    如果说__str__体现的是一种可读性,是给用户看的,那么__repr__方法体现的则是一种准确,
    是给开发人员看的,它对应的是repr()函数,重构__repr__方法后,在控制台直接敲出实例
    对象的名称,就可以按照__repr__中return的值显示了。
    

    img

    打印操作会首先尝试__str__和str聂志函数print运行的内部等价形式,它通常应该返回一个编码字符串,可以用来重新创建对象。
    

    6._del_:

    __del__对象在程序运行结束后进行垃圾回收的时候调用__del__方法可以来释放资源,此时
    del方法是被自动调用的,除非有特殊要求,一般不需要重写,再关闭数据库连接对象的时候
    可以用来释放资源
    

    img

    img

    当程序运行结束后__del__被调用了三次,分别对三个对象逐次进行了垃圾回收
    

    7._getattribute_:

    属性访问拦截器,在访问实例属性时自动调用,子啊python中类的属性和方法都
    理解为属性,且均可以通过__getattribute__获取,当获取属性时,相当于堆属性
    进行重写,如果return object.__getattribute(self,*args,**kwargs)或者
    根据判断return所需要的重写值,如果需要获取某个方法的返回值时,则需要在函数后面
    加上一个()即可,如果不佳的话,返回的是函数引用地址
    

    img

    img

    在创建实例对象s并对其初始化的时候,subject1的值设置为‘python’,subject2的值设置为‘aaa’,在访问s的subject1属性时,因为Test类对object类中的__getattribute__方法进行了重写,所以在调用此方法时,首先对要访问的属性做一个拦截和判断,此时__getattribute__方法中的参数obj对应的是要访问的属性,若要访问subject1属性,则对该属性进行重写,返回了一个不同的字符串,我们可以看到,在初始化时,subject1 的值为‘python’,而在访问subject1这个属性时,返回的值是'redirect python',而在访问subject2时,则调用其父类中的__getattribute__方法,返回正常的subject2属性的值。当然,在访问类的方法属性时,也可以通过重写__getattribute__的方法对其进行重写。
    

    8._base_:

    获取指定类的所有父类构成元素,使用方法为类名.__bases__
    

    img

    img

    9._mro_:

    显示指定类的所有继承脉络和继承顺序,假如这个指定的类不具有某些方法和属性,但与其有血统关系的
    类中具有这些属性和方法,则在访问这个类本身不具有的这些方法和属性时,会按照__mro__显示
    出来的顺序一层一层向后查找,直到找到为止。
    

    img

    img

    博文参考:https://www.jianshu.com/p/3f4786b33f34

  • 相关阅读:
    [状压dp][spfa] Jzoj P3737 挖宝藏
    [计算几何] Jzoj P3736 数学题
    [排序][vector] Jzoj P6288 旋转子段
    [区间dp] Jzoj P6287 扭动的树
    [bfs][spfa] Jzoj P6286 走格子
    [点分治] Luogu P2664 树上游戏
    [树链剖分][树状数组] Luogu P3676 小清新数据结构题
    [计算几何][dp] Luogu P1995 智能车比赛
    [后缀数组][并查集] Luogu P2178 品酒大会
    [莫比乌斯反演][整除分块] Bzoj P2301 Problem b
  • 原文地址:https://www.cnblogs.com/x945669/p/13471777.html
Copyright © 2011-2022 走看看