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)删除对象的方法/属性  ---------------------------------  """