反射

反射(*****)python

  重點:v = getattr(obj , 「func」)  # 根據字符串爲參數(第二個參數),去對象(第一個參數)中尋找與之同名的成員。ide

應用1、首先定義一個handler模塊,handler.py文件內容以下:函數

 

 

模塊:測試

def chi():
    print("大牛一頓吃100碗飯")

def he():
    print("大牛一頓喝一桶")

def la():
    print("大牛很能拉")

def shui():
    print("大牛一次睡一年")

name = "大牛"
master.py

test.pyui

引入 import masterspa

蓋特 getattr()    從xxx對象或者模塊中找xxxxx(字符串) 功能, 變量code

孩子  hasattr()   判斷第二個是否在第一個裏面對象

while 1:
    print("""大牛寫了不少的功能:
    chi
    he
    la
    shui
""")
    val = input("請輸入你要測試的功能") # he

    if hasattr(master, val):
        attr = getattr(master, val) # 從xxx對象或者模塊中找xxxxx(字符串) 功能, 變量
        if callable(attr): # 判斷這個鬼東西是否能夠被調用
            attr()
        else:
            print(attr)
    else:
        print("沒有這個功能")

  

# 把chi函數換成lambda
# print(master.chi)
# setattr(master, "chi", lambda x: x + 1)
# print(master.chi)

delattr(master, "la") # 刪除xxx
master.la()

  

 

 

 

蓋特 getattr()    從xxx對象或者模塊中找xxxxx(字符串) 功能, 變量blog

孩子  hasattr()   判斷第二個是否在第一個裏面內存

面向對象的反射:

class Person:
    def __init__(self, name):
        self.name = name
        self.age = None

    def chi(self):
        print("人喜歡吃東西%s" % self.name)

p = Person("劉偉")
val = input("請輸入你想讓劉偉執行的動做:")
if hasattr(p, val):
    getattr(p, "name")
    func = getattr(p, val)
    func()

  setattr

setattr(p, "name", "大陽哥") # 動態的給對象設置屬性和值
setattr(p, "age", 18) # 不多用. 慎用

  delattr   刪除

delattr(p, "age")

  

反射就是,先定好我要執行什麼功能,而後去你裏面找

 

總結:

  getattr   # 根據字符串的形式,去對象中找成員;

  hasattr   # 根據字符串的形式,去判斷對象中是否有成員;

  setattr   # 根據字符串的形式,動態的設置一個成員(內存);

  delattr   # 根據字符串的形式,動態的刪除一個成員(內存);

相關文章
相關標籤/搜索