反射的基本概念及應用
阿新 • • 發佈:2019-03-24
clas obj post get 除了 resp 基本 lse 情況 1.反射的基本概念
反射的概念與簡單示例
什麽事反射:
反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力(自省)。
hasattr(object,name)
判斷object類中是否有name這個方法,或者是屬性,返回值為True或False;
getattr(object, name, default=None)
獲取object中名為name的這個方法或者是屬性;
setattr(x, y, v)
給name添加屬性
delattr(x, y)
刪除屬性設置
例1 判斷模塊中的方法或屬性:
1 def func1(): 2 return ‘執行了func1‘ 3 4 5 def func2(): 6 return ‘執行了func2‘ 7 8 9 def func3(): 10 return ‘執行了func3‘ 1 import my_model # 同級目錄下直接導入定義的模塊 2 3 4 option = str(input(‘option:‘)) 5 6 if not hasattr(my_model, option): 7 print(‘輸入無效‘) 8 else: 9 ret = getattr(my_model, option)() 10 print(ret)
例2 在類中的使用:
創建一個類,表示你認識的人,
1 class Persion: 2 def __init__(self, name, gender, qq): 3 self.name = name 4 self.gender = gender 5 self.qq = qq 6 7 def play(self): 8 return ‘約{}出來玩‘.format(self.name) 9 10 @property 11 def relation(self): 12 return ‘你和{}是朋友‘.format(self.name) 13 14 15 print(hasattr(Persion, ‘play‘)) # True 有名為sell的方法 16 print(hasattr(Persion, ‘relation‘)) # True
情況一:
你有lisa的QQ,沒有penny的QQ和微信:
1 p1 = Persion(‘lisa‘, ‘girl‘, ‘242432‘) 2 p2 = Persion(‘penny‘, ‘girl‘, None) 3 4 if hasattr(p1, ‘qq‘): 5 print(getattr(p1, ‘play‘)()) 6 else: 7 print(‘沒有聯系方式‘) 8 9 if hasattr(p2, ‘WeChat‘): 10 print(getattr(p2, ‘play‘)()) 11 else: 12 print(‘沒有聯系方式‘) 約lisa出來玩 沒有聯系方式
情況二:
你得到了penny的微信:
1 setattr(p2, ‘WeChat‘, ‘haha‘)
2 if hasattr(p2, ‘WeChat‘):
3 print(getattr(p2, ‘play‘)())
4 else:
5 print(‘沒有聯系方式‘)
約penny出來玩
情況三:
penny刪除了你的微信:
1 delattr(p2, ‘WeChat‘)
2 if hasattr(p2, ‘WeChat‘):
3 print(getattr(p2, ‘play‘)())
4 else:
5 print(‘沒有聯系方式‘)
沒有聯系方式
#2.django中反射的應用
def post(self, request):
func_obj = request.POST.get(‘action‘)
if not hasattr(self, func_obj):
return HttpResponse(‘你的訪問不存在‘)
ret = getattr(self, func_obj)()
# 如果有ret的話返回get請求重新執行
return self.get(request)
獲取前段input框,提交的數據,獲取name=‘action’,對應的值,
如果hasattr()判斷有值得話,getattr()調用執行
反射的基本概念及應用