#-*- coding=utf-8 -*-
class Person(object):
def __init__(self, name):
self.name = name
def eat(self, food):
print("%s want to eat %s"%(self.name, food))
if __name__ == '__main__':
p = Person("Tom")
choice = input(":>>").strip()
print(choice)
#解决问题:通过字符串映射或修改程序运行时的状态、属性、方法, 外部输入的为字符串,而对象不是字典,无法像调用对象那样进行调用
# 初步方法
# 使用if 匹配字符串为函数名则 使用对象obj来进行调用对应的方法, 该方法不建议使用 方法多的情况下 代码重复性太高
if choice == "eat":
p.eat("rice")
#使用反射
#1、根据字符串进行hasattr(obj, name_Str)是否存在对应字符串的方法,存在则返回True 不存在则返回False
#2、使用getattr(obj, name_str) 获取其对应方法的地址, 使用func临时变量接收,fun(argments)进行调用
if hasattr(p, choice):
func = getattr(p, choice)
func("rice")
#3.1、若想添加类中没有的方法,则可以使用setattr(x,y,v)来设置v这个已经定义好的函数为类的成员方法,x.y(x)进行调用,y是字符串(被对象调用的函数名,也是匹配字符串)
def bulk(self, who):
print("%s is want yelling....%s"%(self.name, who))
pass
print(setattr(p, choice, bulk))
#1、使用指定字符串进行调用
p.talk(p, "lucy")
#2、任意字符串进行调用
talk = getattr(p,choice)
talk(p, "lucy")
#Tom is want yelling....
#3、删除
delattr(p, choice)
#p.talk(p, "lucy") #AttributeError: 'Person' object has no attribute 'talk'
#3.2、若想动态的添加类中没有的类的实例属性。可以使用setattr(x,y,v)来设置x是实例对象,y是字符串,需要添加类的实例属性,v是y属性值
# 使用getattr(obj, choice_str) 来获取设置实例属性值
setattr(p, choice, 23)
print(getattr(p, choice))
#4、删除属性 delattr(x, y) x为实例,y要删除的属性/方法,再次获取之后 AttributeError: 'Person' object has no attribute 'age'
delattr(p, choice)
#print(getattr(p, choice))
#结果
# :>>"eat"
# eat
# Tom want to eat rice
# Tom want to eat rice
python-反射
最新推荐文章于 2021-07-09 15:11:04 发布