python面向对象--反射机制
class Black: feture="ugly" def __init__(self,name,addr): self.addr=addr self.name=name def sell_house(self): print("[%s] 正在卖房子"%self.name) def rent_house(self): print("[%s]正在租房子,傻逼才租呢?"%self.name) b1=Black("dream","北京海淀") print(hasattr(Black,"feture")) #b1.name--->b1__dict__["name"] # print(hasattr(b1,"name"))#b1.name # print(hasattr(b1,"sell_house")) # # # print(getattr(b1,"name")) # print(getattr(b1,"sell_house")) # # func=getattr(b1,"rent_house")#没有报错 # func() # # # print(getattr(b1,"rent_house11","没有这个属性")) # b1.sb=True # setattr(b1,"sb",True) # setattr(b1,"name","alex") setattr(b1,"func",lambda x:x+1) setattr(b1,"func1",lambda self:self.name+"sb") print(b1.__dict__) print(b1.func) print(b1.func(1)) print(b1.func1(b1))
# del b1.sb # print(b1.__dict__) # delattr(b1,"sb") # print(b1.__dict__)
1.getattr(object,name)
说明:如果对象object,是不是有name这个属性,如果有获取他的属性,如果没有则报错
2. hasattr(object, name) 说明:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的) 3. setattr(object, name, value) 这是相对应的getattr()。参数是一个对象,一个字符串和一个任意值。字符串可能会列出一个现有的属性或一个新的属性。这个函数将值赋给属性的。该对象允许它提供。例如,setattr(x,“foobar”,123)相当于x.foobar = 123。 4. delattr(object, name) 与setattr()相关的一组函数。参数是由一个对象(记住python中一切皆是对象)和一个字符串组成的。string参数必须是对象属性名之一。该函数删除该obj的一个由string指定的属性。delattr(x, 'foobar')=del x.foobar
# class Foo: # x=1 # def __init__(self,y): # self.y=y # # def __getattr__(self, item): # print("执行__getattr__") # # def __delattr__(self, item): # print("删除操作__delattr__") # # def __setattr__(self, key, value):#设定属性 # print("执行__setattr__") # # self.key=value # self.__dict__[key]=value # f1=Foo(10) # # print(f1.y) # print(getattr(f1,"y"))# len(str)--->str.__len__() # # f1.ss #调用一个对象不存在的属性时触发__getattr__ # # # del f1.y#删除的时候触发__delattr__属性 # print(f1.x) # # f1.x=2#赋值的时候触发__setattr__ # print(f1.__dict__) # print(dir(Foo)) class Foo: def __init__(self,name): self.name=name def __getattr__(self, item): print("你找的属性[%s]不存在"%item) def __setattr__(self, key, value): print("执行setattr",key,value) if type(value) is str: print('开始设置') # self.key=value#触发__setattr__ self.__dict__[key]=value else: print("必须是字符串类型") def __delattr__(self, item): # print("执行delattr",item) print("不允许删除属性[%s]"%item) #del self.item # self.__dict__.pop(item) f1=Foo("alex") f1.age=18#触发__setattr__ #print(f1.__dict__) # print(f1.name) # print(f1.age) # print(f1.gender) print(f1.__dict__) del f1.name print(f1.__dict__) # print(f1.__dict__)
####getattribute的使用
class Foo: def __init__(self,y): self.y=y def __getattr__(self, item): print("你找不到的时候执行我") def __getattribute__(self, item): print("执行的是getattribute") #raise AttributeError("抛出异常") f1=Foo(10) # f1.y f1.xx # f1.xxx#不存在属性访问触发__getattr__
#触发顺序 __getattribute__(最先执行,通过报错上升到,raise xxerror)--->__getattr__(属性找不到报错时执行)
如果我失败了,至少我尝试过,不会因为痛失机会而后悔