python面向對象中的反射: 經過字符串的形式操做對象相關屬性.python中的一切都是對象(均可以使用反射)python
1.getattr(對象,'一個字符串') : 根據字符串的形式去某個對象中獲取對象的成員函數
- 獲取類中的屬性spa
class Foo(object): def __init__(self,name): self.name = name def func(self): print(666) obj = Foo('張三') # 獲取實例變量 v = getattr(obj,'name') print(v) # 獲得結果: 張三 #獲取類中的方法 getattr(obj,'func')() # 獲得結果: 666
- 獲取當前py文件中的屬性code
import sys def func(): print(666) name = '李四' getattr(sys.modules['__main__'],'func')() # 執行fanc函數,獲得結果: 666 ret = getattr(sys.modules['__main__']),'name') print(ret) # 獲得結果: 李四
- 引用模塊中的任意變量對象
# demo.py 文件中的屬性: def func(): print('in func') name = '王二麻子' class User(object): def base(self): print('in base') obj = User() # 運行腳本的文件 import demo getattr(a,'func')() # in func getattr(a,name) # 獲得結果: 王二麻子 getattr(a.User,'base')() #獲得結果: in base print(getattr(a,'obj') # # 獲得結果: 內存地址
2. hasattr(對象,'一個字符串') : 根據字符串的形式去某個對象中判斷是否有改爲員 blog
class A: job = 'IT' def __init__(self): self.name = 'alex' self.age = 83 def func(self): print('in func') obj = A() print(hasattr(obj,'sex')) # False print(hasattr(obj,'func')) # True if hasattr(obj,'func'): if callable(getattr(obj,'func')): # 判斷這個函數是否可被調用 getattr(obj,'func')() # in func
經常使用操做:內存
class User: lis = [('登入','login'), ('註冊','register'), ('刪除文件','remove'), ('複製文件','copy')] def login(self): print('in login') def register(self): print('in register') def remove(self): print('in remove') def copy(self): print('in copy') obj = User() for index,item in enumerate(obj.lis,1): print(index,item[0])
while True: num = input('請選擇要操做的序號:') if num.isdecimal() and 0 < int(num) <= len(obj.lis): if hasattr(obj,obj.lis[int(num)-1][1]): getattr(obj,obj.lis[int(num)-1][1])() else: print('輸入有誤')
運行結果:ci
1 登入 2 註冊 3 刪除文件 4 複製文件 請選擇要操做的序號:1 in login 請選擇要操做的序號:2 in register 請選擇要操做的序號:3 in remove 請選擇要操做的序號:4 in copy
3. setattr(對象,'變量','值') : 根據字符串的形式去某個對像中設置某個成員rem
class Foo: pass obj = Foo() obj.k1 = 999 setattr(obj,'k1',123) # 設置實例變量中的 k1 = 123 print(obj.k1) # 打印結果: 123
4. delattr(對象,'變量') : 根據字符串的形式去某個對象中刪除成員字符串
class Foo: pass obj = Foo() obj.k1 = 999 print(obj.k1) # 打印結果; 999 delattr(obj,'k1') print(obj.k1) # k1 的變量已經刪除,運行會報錯