Python—–反射
class Person(object): """定義一個人類""" def __init__(self, name): self.name = name def eat(self, food): print("%s is eating %s" % (self.name, food)) def talk(self): print("%s is yelling..." % self.name) p = Person("hexingcong") choice = input(">>>:").strip() # 運行時,直接輸入eat,無法運行,因為choice輸入的是字元串格式,無法用p.choice來調用 if hasattr(p, choice): # hasattr(p,choice)可以判斷Person類中有沒有choice這個方法,輸入eat,控制台會輸出True # 輸入talk,控制台會輸出False # delattr(p, choice)是用來刪除對象的方法/屬性的 func = getattr(p, choice) # getattr(p,choice)得到類中的方法, # 一般為其定義一個變數,因為eat這個方法中可能會含有參數然後通過變數來調用 func("apple") # 如果Person類中的eat方法含有參數, 即def eat(self,food), # 此處func(food)中就可以了加一個參數food,來傳值 else: setattr(p, choice, talk) func = getattr(p, choice) func(p) # 如果輸入一個talk,而Person中有沒有talk()方法,就可以通過setattr來添加方法, # 要先在Person類外寫一個talk的方法 # setattr(p, choice, 22) # "22"可以寫成別的 # getattr(p, choice) # print(getattr(p, choice)) # 如果此時輸入name,程式就會報錯,因為name屬性已經存在 # 所以就會運行 第20行 ,而name是一個屬性,所以不能用func加()來調用 """ 總結------------------------------ 1.hasattr(obj,name_str) 判斷一個對象obj里是否有對應的name_str字元串的方法/屬性 2.getattr(obj,name_str) 根據字元串來獲取obj對象里對應的方法的記憶體地址 3.setattr(obj,name_str,v) is equivalent(等同於) to "obj.name_str = v" 4.delattr(obj,name_str)刪除對象的方法/屬性 --------------------------------- """