首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

你所不知道的Python类的常见特殊方法,通俗易懂,拿走不谢

在Python类中有些方法名、属性名的前后都添加了双下划线,这种方法、属性通常都属于python的特殊方法和特殊属性,开发者可通过重写这些方法或直接调用这些方法来实现特殊的功能。

Python是一门尽量简单的语言,不像Java等这类语言需要让类实现接口,并实现接口中的方法,Python采用的是一种“约定”的机制,Python按照约定,以特殊名字的方法、属性来提供特殊的功能。

Python类的特殊方法、特殊属性有些需要开发者重写,有些则可以直接调用,因此掌握这些常见的特殊方法、特殊属性也是非常重要的。

好了,说了这么多,下面就介绍几个常见的特殊方法吧,希望感兴趣的朋友能够记住!

 __repr__方法

先看下面示例:

上面程序输出如下:

为什么会输出这样一个结果呢?事实上,当使用该方法输出Item对象时,实际上输出的是Item对象的__repr__()方法的返回值,也就是说,下面两行代码的输出结果是完全一样的:

print(im)

print(im.__repr__())

__repr__()是Python类中的一个特殊方法,由于object类已提供了该方法,而所有Python类都是object类的子类,因此所有的Python对象都具有__repr__()方法。

因此,当程序需要将任何对象与字符串进行连接时,都可先调用__repr__()方法将对象转换成字符串,然后将两个字符串连接在一起。如下代码所示:

im_str=im.__repr__() + “”

__repr__()是一个非常特殊的方法,是一个“自我描述”的方法,该方法通常用于实现这样一个功能:当程序员直接打印该对象时,系统将会输出该对象的“自我描述”信息,用来告诉外界该对象具有的状态信息。

object类提供的__repr__()方法总是返回该对象实现类的“类名+object at + 内存地址”值,这个返回值并不能真正实现“自我描述”的功能,因此如果用户需要自定义类能实现“自我描述”的功能,就必须重写__repr__()方法。

如下程序所示:

运行结果如下:

由上可知,通过重写Apple类的__repr__()方法,就可让系统在打印Apple对象时打印出对象的“自我描述”信息。

大多数情况下,重写__repr__()方法总是返回该对象的所有令人感兴趣的信息所组成的字符串,通常可返回如下格式的字符串:

类名[field1=值1, field2=值2, ...]

析构方法__del__

与__init__()方法对应的是__del__()方法,__init__()方法用于初始化Python对象,而__del__()则用于销毁Python对象,在任何Python对象将要被系统回收之时,系统都会自动调用该对象的__del__()方法。

当程序不再需要一个Python对象时,系统必须把该对象所占用的内存空间释放,这个过程称为垃圾回收(GC, Garbage Collector),Python会自动回收所有对象所占用的内存空间,因为开发者无须关心对象垃圾回收的过程。

Python采用自动引用计数(ARC)方式来回收对象所占用的空间,当程序中有一个变量引用该python对象时,Python会自动保证该对象引用计数为1;当程序中有两个变量引用该Python对象时,Python会自动保证该对象引用计数为2……以此类推,如果一个对象的引用计数变成了0,则说明程序中不再有变量引用该对象,表明程序不再续约该对象,因此Python就会回收该对象。

大部分时候,Python都的ARC都能准确、高效的回收系统中的每个对象,但如果系统中出现循环引用的情况,如对象a持有一个实例变量引用对象b,而对象b又持有一个实例变量引用对象a,此时两个对象的引用计数都是1,而实际上程序已经不再有变量引用它们,系统应该回收它们,此时Python的垃圾回收器就可能没那么快,要等专门的垃圾回收器来检测并回收这种引用循环。

当一个对象被垃圾回收时,Python就会自动调用该对象的__del__方法,但不要以为对一个变量执行del操作,该变量所引用的对象就会被回收,只有当对象的引用计数变成0时,该对象才能被回收。因此,如果一个对象有多个变量引用它,则del其中一个变量是不会回收该对象的,不信看下面示例:

上面程序中第6行重写了Item类的__del__()方法,该方法就是Item类的析构函数,当系统将要回收Item时,系统会自动调用Item对象的__del__()方法。

其中,先创建了一个Item对象,并将该对象赋值给im变量,然后将im赋值给变量x,这样程序中有两个变量引用Item对象,则当执行第12行的del im删除im对象后,此时由于还有变量引用该Item对象,因此程序并不会回收Item对象,运行结果如下:

可以看出,del im执行后,程序并没有回收Item对象,只有等到程序执行将要结束时(系统必须回收所有对象),系统才会回收Item对象。

如果将程序中第11行的x=im去掉,再次运行程序,则输出结果如下:

可以看出,当程序执行del im之后,此时程序中不再有任何变量引用该Item对象,因此系统会立即回收该对象,则无须等到程序结束之前。

 __dir__方法

对象的__dir__()方法用于列出对象内部的所有属性(包括方法)名,该方法将会返回包含所有属性(方法)名的序列。

当程序对某个对象执行dir(object)函数时,实际上就是将该对象的__dir__()方法返回值进行排序,然后包装成列表。

示例如下:

运行结果如下:

可以看出,程序不仅会输出为对象所定义的name、price和info三个属性和方法,还有大量系统内置的属性和方法输出。

 __dict__属性

__dict__属性用于查看对象内部存储的所有属性名和属性值组成的字典,通常程序直接使用该属性即可。

程序使用__dict__属性即可查看对象的所有内部状态,也可通过字典语法来访问或修改指定属性的值。

示例如下:

上面程序中第10行直接输出对象的__dict__属性,这样将会直接输出该对象内部存储的所有属性名和属性值组成的dict对象;接下来的第12和14行通过__dict__属性访问对象的name、price两个属性;最后第17和18行通过__dict__属性对name、price两个属性赋值。

运行结果如下:

 其他几个特殊方法

当程序操作(包括访问、设置、删除)对象的属性时,Python系统同样会执行该对象特定的方法。这些方法主要有如下几个:

1.     __getattribute__(self, name)

当程序访问对象的name属性时被自动调用

2.     __getattr__(self, name)

当程序访问对象的name属性且该属性不存在时被自动调用

3.     __setattr__(self, name, value)

当程序对对象的name属性赋值时被自动调用

4.     __delattr__(self, name)

当程序删除对象的name属性时被自动调用

通过重写上面的方法,可为Python类“合成”属性,当属性不存在时,程序会委托给上面的__getattr__、__setattr__、__delattr__方法实现,因此程序可通过重写这些方法来“合成”属性。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201108A04WSI00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券