Python-面向对象之反射
反射
实现了动态的装配,通过字符串来反射类中的属性和方法。
一、hasarttr(obj,name_str)
作用:判断一个对象obj中是否有对应的name_str字符串的属性或者方法。
class Dog(object): def __init__(self, name): self.name = name def eat(self, food): print("%s is eating %s" % (self.name, food)) d = Dog("Tom") d.eat('Apple') choice = input(">>>:").strip() print(hasattr(d, choice)) # obj中是否有对应的choice字符串的属性或者方法 # # 输出 # >>>:name # 输入对象存在属性 # True # >>>:eat # 输入对象存在的方法 # True
二、getattr(obj,name_str)
作用:根据字符串name_str获取obj对象中的对应方法的内存地址或者对应属性的值。
class Dog(object): def __init__(self, name): self.name = name def eat(self, food): print("%s is eating %s" % (self.name, food)) d = Dog("Tom") d.eat('Apple') choice = input(">>>:").strip() print(getattr(d, choice)) # 获取d对象中的对应方法的内存地址或者对应属性的值 # >>>:name # 获取输入对象的值 # Tom # >>>:eat # 获取输入对象的方法 # <bound method Dog.eat of <__main__.Dog object at 0x000002A4ADB732E8>>
三、setattr(x,y,z)
作用:给obj对象添加一个新属性或者新方法,setattr(x, 'y', v) is equivalent to ``x.y = v''。
1、给对象新增一个新方法
def bulk(self): # 先定义一个bulk函数 print("%s is yelling..." % self.name) class Dog(object): def __init__(self, name): self.name = name def eat(self, food): print("%s is eating %s" % (self.name, food)) d = Dog("Tom") choice = input(">>>:").strip() setattr(d, choice, bulk) # 输入的是talk,所以又等同于d.talk = bulk # d.talk(d) 直接写死,用d.talk(d),一般不这么写 func = getattr(d, choice) # 用getattr来获取 func(d) # 输出 # >>>:talk # Tom is yelling...
2、给对象新增一个属性
class Dog(object): def __init__(self, name): self.name = name def eat(self, food): print("%s is eating %s" % (self.name, food)) d = Dog("Tom") choice = input(">>>:").strip() setattr(d, choice, 'Apple') # food,所以又等同于d.food = 'Apple' # print(d.food) 这样就写死了,还是用下面一种 print(getattr(d, choice)) # 输出 # >>>:food # Apple
四、delattr(x,y)
作用:删除obj对象中的属性或者方法,delattr(x, 'y') is equivalent to ``del x.y'' 。
class Dog(object): def __init__(self, name): self.name = name def eat(self, food): print("%s is eating %s" % (self.name, food)) d = Dog("Tom") choice = input(">>>:").strip() delattr(d, choice) # 根据字符串删除属性或者方法 print(d.name) print(d.eat)
五、综合使用hasattr、getattr、setattr
class Dog(object): def __init__(self, name): self.name = name def eat(self, food): print("%s is eating %s" % (self.name, food)) d = Dog("Tom") choice = input(">>>:").strip() if hasattr(d, choice): # 判断d对象中存在属性和方法 name_value = getattr(d, choice) # 获取属性值 print(name_value) setattr(d, choice, "Jerry") # 修改属性值 print(getattr(d, choice)) # 重新获取属性的值 else: setattr(d, choice, None) # 设置不存在的属性值为None v = getattr(d, choice) print(v)