__getattr__是当属性不存在的时候运行
__setattr__是设置的时候自动运行 低层实现方法self.__dict__[key]=value
__delattr__是删除的时候自动设置 低层实现方法self.__dict__.pop(key)
补充:
上面的是用点方式来使用
__getitem__
__setitem__
__delitem__都是用[] 来用
反射
hasattr(object,name)
getattr(object,name,default) 如果查询不到则返回default 如果没有default 那么如果查询不到则报错
setattr(object,keys,values) 可以添加也可以修改 可以添加匿名函数
delattr(object,keys)
授权:
import time class Open: def __init__(self,filename,mode="w",encoding="utf8"): self.file=open(filename,mode,encoding=encoding) self.mode=mode self.encoding=encoding def write(self,name): self.file.write("%s %s" %(time.strftime("%Y-%m-%d %X"),name)) def __getattr__(self, item): return getattr(self.file,item) f=Open("123.txt","w") f.write("123")
__getattribute__的使用
class Test: def __init__(self,s): self.s=s def __getattr__(self, item): print("输出的是getattr") def __getattribute__(self, item): print("输出的是getattribute") raise AttributeError("123") f=Test(10) print(f.s) #输出的是getattribute #输出的是getattr #None
无论何时都会触发__getattribute__
__str__ 与__repr__的使用
class Foo1: def __init__(self,name): self.name=name def __repr__(self): #与__str__一样 return "%s %s" %(time.strftime("%Y/%m/%d %X"),self.name) # 需要实例才可以,类不可以 s1=Foo1("123") print(s1) #显示的方法都是str(s1)------>s1.__str__ #2020/07/06 16:40:48 123
repr只是在cmd中使用能自动返回
而str需要print才行
析构函数 __del__
class F: def __init__(self,name): self.name=name def __del__(self): print("我执行了") f=F("ljh") del f.name print("_______________>") #运行结果 # _______________> # 我执行了 class F: def __init__(self,name): self.name=name def __del__(self): print("我执行了") f=F("ljh") del f print("_______________>") #运行结果 # 我执行了 # _______________>
总结:__del__()是在类结束时自动运行,而实例结束无法自动运行
迭代器协议:
class Foo: def __init__(self,name): self.name=name def __iter__(self): return self def __next__(self): if self.name==15: raise AttributeError("错误") self.name+=1 return self.name s1=Foo(10) print(s1.__next__()) print(s1.__next__()) print(s1.__next__()) print(s1.__next__()) print(s1.__next__()) print(s1.__next__())
原文:https://www.cnblogs.com/rxybk/p/13285026.html