反射就是透過字串對映或修改程式執行時的狀態、屬性、方法
有四個常用方法:
-
hasattr(obj,name_str) 判斷一個obj物件是否有對應name_str的方法
-
getattr(obj,name_str) 根據字串name_str獲取Obj物件中對應方法的記憶體地址
-
setattr(obj,key,value) 為物件Obj新增或修改屬性或者方法
-
delattr(obj,name_str) 刪除物件obj中名為name_str的屬性或者方法
反射Demo舉例:
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
'''
hasattr(obj,name_str) 判斷一個obj物件是否有對應name_str的方法
getattr(obj,name_str) 根據字串name_str獲取Obj物件中對應方法的記憶體地址
setattr(obj,key,value) 為物件Obj新增或修改屬性或者方法
delattr(obj,name_str) 刪除物件obj中名為name_str的屬性或者方法
'''
def bulk(self):
print("%s is yelling"%self.name)
class Dog(object):
def __init__(self,name):
self.name=name
def eat(self,food):
print("%s is eating %s"%(self.name,food))
jim=Dog("Jim")
choise=input(">>輸入需要執行的操作:").strip()
if hasattr(jim,choise):
func=getattr(jim,choise)
func("巧克力")
#delattr(jim,choise)
else:
#Python學習交流群:153708845
#動態裝配一個方法 choise為方法名,bulk為方法的記憶體地址
setattr(jim,choise,bulk)
# 呼叫時用轉配的方法名,即傳入的choise值,這裡需要傳入物件本身
getattr(jim,choise)(jim)
#動態裝配一個屬性,也可以修改屬性
setattr(jim,choise,"新裝配的屬性")
print(getattr(jim,choise))
#print(jim.name)
#jim.eat("狗糧")