常用魔术方法总结

python 中常见的魔术方法:
1、__getattr__(self, item): 方法
在访问对象的item属性的时候,如果对象和他的父类并没有这个相应的属性,方法,那么将会调用这个方法来处理。有相应的属性或方法时调用对象实例的相应属性或方法。
参数 item 代表 调用的属性或方法。

class Foo:
def __init__(self, x):
self.x = x

@property
def get_01(self):
print(111)
return self.x

def __getattr__(self, item):
# 当实例对象的的 f.a属性不存再时执行的操作
print('执行的是我')
print(item)
return self.x
f1 = Foo(10)
print(f1.get_01) # 111,10
print(f1.a) # 执行的是我 , a, 10
print(f1.get_02) # 执行的是我 , get_02, 10

2.__setattr__(self, item, value): 方法
会拦截所有属性的的赋值语句。如果定义了这个方法,self.arrt = value 就会变成self,__setattr__("attr", value).这个需要注意。
当在__setattr__方法内对属性进行赋值是,不可使用self.attr = value,因为他会再次调用self,__setattr__("attr", value),则会形成无穷递归循环,
最后导致堆栈溢出异常。应该通过对属性字典做索引运算来赋值任何实例属性,也就是使用self.__dict__['name'] = value.

class Student:
def __init__(self,item):
self.x=item
def __getattr__(self, item):
return item + ' is not exits'

def __setattr__(self, key, value):
print("执行我")
self.__dict__[key] = value+2


s = Student(10) # # 调用__setattr__ 方法 执行我
print(s.x) # 12
print(s.name) # 调用__getattr__方法 输出'name is not exits'
s.age = 1 # 调用__setattr__ 方法
print(s.age) # 输出 3

3、__str__(self): 方法 打印实例对象时 自动被调用
class Student:
def __init__(self,item):
self.x=item
def __str__(self):
print("打印对象时调用")
return "111"

s=Student(10)
print(s) # 打印对象时调用 111

猜你喜欢

转载自www.cnblogs.com/laowang-106/p/11353654.html