双下方法的作用

  双下方法,也被称为魔法方法。为什么我喜欢叫它双下方法呢?因为本人在读"流程的Python"一书中,作者对其__开头__结尾的方法是叫的双下方法(注意与只有开头双下划线的隐藏属性/方法进行区分),故我也跟着这样叫了。其实个人比较反感叫魔法方法,因为魔法这一词很玄乎,所以不太喜欢这种叫法。

  那么双下方法的作用即在满足某一特定的条件下进行自动调用。比如当我们使用len()对某个实例对象进行统计长度时,就会自动触发其类中的__len__方法。

  使用双下方法的好处:可以高度定制化你的类。

print([1,2,3].__len__()) # 3

from collections import UserList
class MyList(UserList):

    def __len__(self):  # 由于 __len__ 需要返回统计的长度,故我们将其调用父类方法并进行返回即可。
        print("执行了...")
        return super(MyList,self).__len__()

ml1 = MyList([1,2,3,4])
 
print(len(ml1))

# ==== 执行结果 ====

"""
3
执行了...
4
"""

常用双下方法

_getattribute__

  触发条件

    以任何形式对对象属性或方法进行访问时都会去调用实例化出自己类中的__getattribute__方法。

    在查找属性/方法不存在时,抛出AttributeError的异常。如属性或方法存在则返回该属性或方法。

  实例对象调用实例化出自己类里面的__getattribute__,类对象则去调用元类中的__getattribute__

print([1,2,3].__len__()) # 3

from collections import UserList
class MyList(UserList):

    def __len__(self):  # 由于 __len__ 需要返回统计的长度,故我们将其调用父类方法并进行返回即可。
        print("执行了...")
        return super(MyList,self).__len__()

ml1 = MyList([1,2,3,4])
 
print(len(ml1))

# ==== 执行结果 ====

"""
3
执行了...
4
"""

_del__

  触发条件

    在对对象进行手动的del操作时触发,或者在程序运行结束后自动触发。

    实例对象调用实例化出自己类里面的__del__,类对象则去调用元类中的__del__

  注意

    对于程序运行完后自动触发这一条,类对象的__del__触发一定在实例对象之前。

  作用

    可以用于关闭一些占据系统资源的操作,如打开文件等等。

# ==== __del__ 功能演示 ====

class MetaClass(type):  # 元类必须继承type
    name = "元类"

    def __del__(self):
        print("执行元类中的__del__")


class MyClass(object,metaclass=MetaClass):
    author = "云崖"

    def __init__(self,name):
        self.name = name
        print("执行了 __init__ ")


    def __del__(self):
        print("执行del...")

m1 = MyClass("Yunya")
del m1.name

# ==== 执行结果 ====

"""
执行了 __init__ 
执行元类中的__del__
执行del...
"""
__del__ 功能演示

相关文章: