反射

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 的變量已經刪除,運行會報錯
相關文章
相關標籤/搜索