能否创建包含类方法的字典,用于调用不同类实例的方法?
问题:能否通过字典存储类方法,调用不同实例的对应方法?
假设有如下Cat类:
class Cat: def __init__ (self): pass def sayMeow (self): print('Meow!') def sayMrrr (self): print('Mrrrr!') def beHungry(self): print('Am am am am!')
以及该类的多个实例:
#... maria = Cat() adelina = Cat() #...
我们希望创建一个包含该类方法的字典cat_methods,以便通过字典元素调用maria和adelina的对应方法,示例字典如下:
cat_methods = { 'meow': 0, # TODO method sayMeow 'mrrr': 0, # TODO method sayMrrr 'am': 0 # TODO method beHungry }
请问这是否可行?
回答
当然可行,给你两种实用的实现方式:
方式一:直接存类方法对象
把Cat类的方法直接放进字典里,调用的时候把实例作为参数传进去就行——因为类的方法没绑定具体实例时,需要手动传入实例当第一个参数:
cat_methods = { 'meow': Cat.sayMeow, 'mrrr': Cat.sayMrrr, 'am': Cat.beHungry }
调用示例:
cat_methods['meow'](maria) # 打印 Meow! cat_methods['mrrr'](adelina) # 打印 Mrrrr!
方式二:存方法名称,用getattr调用
要是不想直接存方法对象,也可以在字典里存方法的字符串名称,调用时通过getattr从实例里拿到对应方法再执行:
cat_methods = { 'meow': 'sayMeow', 'mrrr': 'sayMrrr', 'am': 'beHungry' }
调用示例:
getattr(maria, cat_methods['meow'])() # 打印 Meow! getattr(adelina, cat_methods['am'])() # 打印 Am am am am!
两种方式都能满足需求,第一种更直接高效,第二种灵活性更强,比如后续可以轻松修改字典里的方法名映射。
内容的提问来源于stack exchange,提问作者iEPCBM
相关产品推荐
相关产品推荐

