1.类外面的函数要装到类里怎么办?
2.调用哪个函数我事先并不知道,通过字符串的输入来确定调用哪个,这该如何处理?
动态装饰很好的解决了这个问题。与其它语言相比,python里实现起来还是容易的。
"""
动态装饰函数
通过字符串调动函数名
#hasattr(obj,name_str) 判断 一个对象obj,是否有对应的name_str
#getattr(obj,name_str) 根据字符串去获取obj对象里的对应的方法的内存地址,
#setattr(obj,'y',z) 设置obj 属性名为y,新值为Z
# delatter(obj,'V') 删除对象obj V的值
1.动态装一个方法
2.动态装一个属性
3.删除一个属性或者方法
"""
def bulk(self):
print("%s is yelling"%self.name)
class Dog(object):
def __init__(self,name):
self.name=name
def eat(self):
print("%s is eating..."%self.name)
d=Dog("MYDOG") #1.实例化对象
funName=input(">>:").strip() #1.新方法 1.1输入字符串
if (hasattr(d,funName)): #1.2hasattr(obj,name_str) 1.判断 一个对象obj,是否有对应的name_str
func=getattr(d,funName) #1.3 getattr(obj,name_str) 2. 一个对象obj, 映射出内存对象的地址
else:
setattr(d,funName,bulk) #1.4新方法 setattr(d,name_str) 外面函数bulk与funName关联起来 装到类里面 bulk
d.talk(d) #1.5后面的字符串名称可以随便定义,但调用的是前一句话的值
ProName = input(">>:").strip() # 2.新属性
if (hasattr(d,ProName)): #2.1 hasattr(obj,name_str)
attr=getattr(d,ProName) # 2.2 得到对应的属性字符串
setattr(d,ProName,"newPro") # 2.3 (obj,属性名,新属性值)
else:
setattr(d, ProName, "newPro")
attr = getattr(d, ProName)
print(attr) # 打印属性
DelName = input(">>:").strip() # 3.删除
if (hasattr(d, DelName)): # hasattr(obj,name_str)
delattr(d,DelName)
else:
setattr(d, ProName, "newPro")
attr = getattr(d, ProName)
print(d.name) # 删除后再打印