反射
class ClassA: name = 'xiaoming' def __init__(self): self.y = 'y' #先执行 __setattr__ 在执行__getattribute__ self.z = "z" def __getattribute__(self, item): #只有点(.)才会触发此方法,a["dd"] 不会触发和getattr一样 # print(item) if item == "y": # 每次访问属性之前都先执行此方法,可以自定义属性访问的权限 pass else: return super().__getattribute__(item) #必须加否则报错 def __getattr__(self, item): pass #当访问的属性不存在的时候执行此方法注意:obj.__dict__['属性名']不会调用该属性" def __delattr__(self, item): del self.__dict__[item] def __setattr__(self, key, value): #必须要有__setattr__方法 self.__dict__[key] = value a = ClassA() print(a.name) #xiaoming print(a.y) #None print(a.z) #z # 获取属性的三种方式 # print(obj.name) # print(a.__dict__["y"]) #a.__dict__会触发__getattribute__ 但是["y"] 不会触发 # getattr(obj,"name")
getitem settiem deltiem
如果想对实例进行 obj ["val"]、 del obj ["key"] 、obj ["key "] = "val" 操作,必须定义 getitem settiem deltiem 方法。否则只能通过点( . ) 属性名来进行一系列操作
class WPUnit(object): def __setitem__(self, key, value): self.__dict__[key] = value def __getitem__(self, key): if key in self.__dict__: return self.__dict__[key] else: r = "" self.__setitem__(key, r) return None def __delitem__(self, key): del self.__dict__[key] a = WPUnit() a["name"]="xiaoming" print(a.name) #xiaoming print(a["name"]) #xiaoming print(a.__dict__) #{'name': 'xiaoming'} del a["name"] print(a.__dict__)