映射:通过用户输入的字符串调用对象的属性和方法。
调用时使用对象真实的方法名和属性名,***attr()的参数使用的是用户输入的字符串,由此完成用户输入的字符串和对象实际属性和方法的连接。
hasattr(obj,name_str) 判断对象obj里面是否有对应的name_str字符串的方法;
getattr(obj,name_str) 根据字符串去获取obj对象里的对应的方法的内存地址;
class Person(object):
def __init__(self,name):
self.name=name
def eat(self,food):
print('%s is eating '%self.name,food) #注意此处的用法
p1=Person('刚田武')
choice=input('please input:').strip()
if hasattr(p1,choice):
func=getattr(p1,choice)
func('包子')
运行后输入eat,输出为:
刚田武 is eating 包子
如果输入的是name,程序报错,func被赋值p1.name,是属性值,不能被调用
setattr(obj,'name_str',z) 相当于obj.name_str=z
用来设置属性值时:
class Person(object):
def __init__(self,name):
self.name=name
def eat(self,food):
print('%s is eating '%self.name,food) #注意此处的用法
def laugh(self):
print('%s is laughing'%self.name)
p1=Person('刚田武')
choice=input('please input:').strip()
if hasattr(p1,choice):
setattr(p1,choice,'胖虎')
print(p1.name)
运行后,输入name,输出为:
胖虎
用来设置成方法时:
class Person(object):
def __init__(self,name):
self.name=name
def eat(self,food):
print('%s is eating '%self.name,food) #注意此处的用法
def laugh(self):
print('%s is laughing'%self.name)
p1=Person('刚田武')
choice=input('please input:').strip()
if hasattr(p1,choice):
setattr(p1,choice,'胖虎')
else:
setattr(p1,choice,laugh)
p1.talk(p1)
运行,只有当输入talk时,程序正常运行,输出为:
刚田武 is laughing
把:
else:
setattr(p1,choice,laugh)
p1.talk(p1)
修改成:
else:
setattr(p1,choice,laugh)
func =getattr(p1,choice)
func(p1)
输入任意,都可以执行laugh()方法
delattr(obj,name_str) 删除obj.name_str属性