码迷,mamicode.com
首页 > 编程语言 > 详细

Python学习————魔法方法

时间:2020-08-10 19:51:20      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:关闭   编码   测试   基础上   信息   显示   字符   使用   指定   

Python中的魔法方法

1._init_:

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

技术图片

2._new_:

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

技术图片

技术图片

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

当__new__返回正确的参数

技术图片

技术图片

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

3_class_:

技术图片

技术图片

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

技术图片

技术图片

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

技术图片

技术图片

4._str_:

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

技术图片

技术图片

5._repr_:

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

技术图片

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

6._del_:

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

技术图片

技术图片

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

7._getattribute_:

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

技术图片

技术图片

在创建实例对象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__

技术图片

技术图片

9._mro_:

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

技术图片

技术图片

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

Python学习————魔法方法

标签:关闭   编码   测试   基础上   信息   显示   字符   使用   指定   

原文地址:https://www.cnblogs.com/x945669/p/13471777.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!