Python魔法方法

本文最后更新于:2022年12月17日 中午

Python的魔法方法

目录:

参考链接:

Python中的魔法方法像是Java中的重载,Python中的魔法方法可以理解为:对类中的内置方法的重载,注意这里不是重写。

下面列出部分常用的方法:

构造方法__new__

__init__方法

__str____repr__

__str__定义对类的实例调用str()时的行为。而__repr__定义对类的实例调用repr()的行为,这两者的区别就是repr面向开发者,str面向用户。定义类的输出的时候经常会使用这两个其中的魔法。

实例:

class Apple(object):

    def __init__(self,name,weight):
        self.name = name
        self.weight = weight

    def __str__(self):
        return '{}:{}'.format(self.name,self.weight)

print(Apple('A','30g'))
# 输出;A:30g

这里可以看见__str__起作用了,但是如果我们在命令行里运行Apple('A','30g')的话,输出的可能是:

<__main__.Apple object at 0x000001785036DEE0>

因为这里是__repr__控制的,修改Apple类,添加__repr__ = __str__则可以输出:

A:30g

__getattr____setattr____delattr__

__getattr__定义对象访问不存在的属性或方法时的行为(对象访问不存在的属性或者调用方法时调用)
__setattr__定义对属性或方法进行修改操作时的行为,在实例化的时候,会在__init__里初始化,对value的属性值进行了设置,这时候会调用__setattr__方法。
需要注意的地方是,在重写__setattr__方法的时候千万不要重复调用造成死循环。
__delattr__定义定义删除属性时的行为

实例:
可以参考ORM框架Model

class Apple(object):
    def __init__(self, name, weight):
        print("进入__init__初始化对象属性")
        self.name = name
        self.weight = weight

    def __getattr__(self, attr):
        return "不存在{}属性".format(attr)

    def __setattr__(self, name, value):
        print("正在生成实例化对象的{}属性,值为{}".format(name, value))
        object.__setattr__(self, name, value)
        return "正在生成实例化对象的{}属性,值为{}".format(name, value)

    def __delattr__(self, attr: str) -> None:
        print("正在删除{}属性".format(attr))
        object.__delattr__(self, attr)


a = Apple("A", "30g")
print("a.name:",a.name)
print("a.weight",a.weight)
print(a.key)
del a.name
del a.weight
print(a.name,a.weight)

结果:

进入__init__初始化对象属性
正在生成实例化对象的name属性,值为A
正在生成实例化对象的weight属性,值为30g
a.name: A
a.weight 30g
不存在key属性
正在删除name属性
正在删除weight属性
不存在name属性 不存在weight属性

Python魔法方法
http://yorick.love/2022/04/17/Python/Python魔法方法/
作者
Yorick
发布于
2022年4月17日
许可协议