【反射】
作用:可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定’,什么意思?即你可以事先把主要的逻辑写好(只定义接口),然后后期再去实现接口的功能
例如:多人开发时,你不知道对面完成接口情况,可以用hasattr获取下有没有功能方法,没有的话就不去调用该功能
- hasattr(object,name) 【检测是否含有某属性】
- getattr(object, name, default=None) 【获取指定属性】
- setattr(x, y, v)【设置属性】
- delattr(x, y)【删除指定属性】
class BlackMedium:
feature='Ugly'
def __init__(self,name):
self.name=name
def sell_house(self):
print('%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不傻逼' %self.name)
b1=BlackMedium('万成置地')
print(hasattr(b1,'name'))
n=getattr(b1,'name')
func=getattr(b1,'rent_house')
func()
print(getattr(b1,'aaaaaaaa','不存在啊'))
setattr(b1,'sb',True)
delattr(b1,'addr')
delattr(b1,'show_name111')
print(b1.__dict__)
拦截器- 【属性】将调用时执行
setattr,delattr,getattr
class Foo:
x=1
def __init__(self,y):
self.y=y
def __getattr__(self, item):
print('----> from getattr:你找的属性不存在')
def __setattr__(self, key, value):
print('----> from setattr')
def __delattr__(self, item):
print('----> from delattr')
self.__dict__.pop(item)
f1=Foo(10)
print(f1.__dict__)
f1.z=3
print(f1.__dict__)
f1.__dict__['a']=3
del f1.a
print(f1.__dict__)
f1.xxxxxx
拦截器- 【值】将调用时执行
get,set,delete
class Foo:
def __get__(self, instance, owner):
print('触发get')
def __set__(self, instance, value):
print('触发set')
def __delete__(self, instance):
print('触发delete')
f1=Foo()
f1.name='egon'
f1.name
del f1.name