反射

             反射      **********             ide

       gerattr(a,b)    根據字符串爲參數 (第二個參數) , 去 對象(第一個參數) 中尋找與之同名的成員.函數

  例一 : 面對函數的反射spa

    如今有2個py文件(在同一個文件下面的平等文件),如今想從run.py 中調用 handler.py 中的東西.3d

 

#handler.py

f0 = 9

def f1():
    print('F1')

def f2():
    print('F2')

def f3():
    print('F3')

def f4():
    print('F4')

def f5():
    print('F5')

 

#run.py
#咱們能夠使用if ...elif....的方法執行
import handler

while True:
    print("""
    系統支持的函數有:
    1 f0
    2 f1
    3 f2
    4 f3
    5 f4
    6 f5
    """)
    num = input("請輸入您要執行的函數:")
    if num == "f0":
        print(9)
    elif num == 'f1':
        handler.f1()
    elif num == 'f2':
        handler.f2()
    elif num == 'f3':
        handler.f3()
    elif num == 'f4':
        handler.f4()
    elif num == 'f5':
        handler.f5()

#用 if...elif...方法,若是在handler.py文件的函數特別多,就會使代碼繁雜.
if....eliff...方法
while True:
    print("""
    系統支持的函數有:
        1. f1
        2. f2
        3. f3
        4. f4
        5. f5
    """)
    val = input("請輸入要執行的函數:") # val = "f1"

    if hasattr(handler,val):
        func_or_val = getattr(handler,val)     # 根據字符串爲參數,去模塊中尋找與之同名的成員。
        if isinstance(func_or_val,FunctionType):  #判斷是不是函數
            func_or_val()
        else:
            print(func_or_val)
    else:
        print('handler中不存在輸入的屬性名')
方法 二

 

    全部,咱們 比較 方法一 和方法二,發現方法二比方法一簡介並且定位準code

  例二 : 面對 面向對象的反射對象

class Foo(object):

    country = "中國"

    def func(self):
        pass


v = getattr(Foo,'func') # Foo.func # 根據字符串爲參數,去類中尋找與之同名的成員。
print(v)

obj = Foo()
v = getattr(obj,"func") # obj.func # 根據字符串爲參數,去對象中尋找與之同名的成員。
print(v)

結果:
<function Foo.func at 0x00000000025FCEA0>
<bound method Foo.func of <__main__.Foo object at 0x00000000025FB2E8>>

 

#反射----類
class Foo(object):

    def __init__(self,a1):
        self.a1 = a1
        self.a2 = None

obj = Foo(1)


v1 = getattr(obj,'a1')
print(v1)

setattr(obj,'a2',2)

 

x1 = 123


def f1(arg):
    print(arg,666)
xx.py

 

import xx

# getattr                          #查找
v1 = getattr(xx,'x1')
v2 = getattr(xx,'f1')
v2('楊森')                      # 楊森 666                   

# hasattr                        #判斷是否由成員
v3 = hasattr(xx,'x1')
v4 = hasattr(xx,'f1')
v4 = hasattr(xx,'f1')
v5 = hasattr(xx,'xxxxxxx')
print(v3,v4,v5)                   #True True False

# setattr                         #在內存中添加 x2= 999
setattr(xx,'x2',999)
v6 = getattr(xx,'x2')
print(v6)                          # 999

setattr(xx,'f2',lambda x:x+1)   #添加一個函數
v7 = getattr(xx,'f2')
v8 = v7(1)
print(v8)                        # 2 由於 添加函數 x+1  參數爲1

# delattr                        #刪除 x1
delattr(xx,'x1')
v9 = getattr(xx,'x1')
print(v9)

結果:
調用 xx.py內的內容

     

      總結:blog

           getattr(a,b)  : 根據字符串爲參數(第二個參數b),去對象中(第一個參數a)尋找與之同名的成員內存

           hasattr(a,b) : 根據字符串形式(第二個參數b) ,去判斷對象(第一個參數a)中是否有該成員v8

           setattr (a,b,c): 參數分別是新建對象所屬類的類名,新建對象的對象名,對象的值 (在內存中體現,在文件中是看不到的)字符串

           delattr(a,b) : 根據字符串爲參數 (b),動態的刪除對象中(第一個a)一個成員(在內存中體現)

相關文章
相關標籤/搜索