首页 > 代码库 > Python-面向对象之反射
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 = http://www.mamicode.com/getattr(d, choice) # 获取属性值"Jerry") # 修改属性值 print(getattr(d, choice)) # 重新获取属性的值 else: setattr(d, choice, None) # 设置不存在的属性值为None v = getattr(d, choice) print(v)
Python-面向对象之反射
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。