Python—–反射

  • 2020 年 1 月 16 日
  • 筆記

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)刪除對象的方法/屬性  ---------------------------------  """