Python魔法方法
本文最后更新于:2022年12月17日 中午
Python的魔法方法
目录:
参考链接:
Python中的魔法方法像是Java中的重载,Python中的魔法方法可以理解为:对类中的内置方法的重载,注意这里不是重写。
下面列出部分常用的方法:
构造方法__new__
__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魔法方法
https://yorick-ryu.github.io/Python/Python魔法方法/