Python学习————魔法方法

Posted Dimple_Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Python学习————魔法方法的主要内容,如果未能解决你的问题,请参考以下文章

Python学习笔记之魔法方法

python学习 魔法方法属性和迭代器

Python学习————魔法方法

python语法学习第十天--魔法方法

[小甲鱼]入门学习python笔记 魔法方法

进阶学Python:Python面向对象系列之魔法方法!