我希望有一个带动态方法的课程。
从这些数组:
prefix = ['android','iphone','blackberry']
method = ['AddToPush','DelFromPush','GetPushMessages']
我想创建一个类:
class MobileManager(object)
def __init__(self):
self.mobileLib = MobileLib()
def androidAddToPush(self, args):
self.mobileLib.AddToPush(args, 'android')
def iphoneAddToPush(self, args):
self.mobileLib.AddToPush(args, 'iphone')
def blackberryAddToPush(self, args):
self.mobileLib.AddToPush(args, 'blackberry')
[...]
如何在运行时生成/创建这些方法?
答案 0 :(得分:1)
如果您在初始时定义了前缀/方法集,则可以尝试以下方法:
class MobileManager(object):
def __init__(self):
for prefix_name in prefix:
for method_name in method:
func = lambda self, args: getattr(self.mobileLib, method_name)(args, prefix)
full_method_name = "%s%s" % (prefix, method_name)
setattr(self, full_method_name, func)
...
如果你的动态方法变得更复杂,那么lambda很快就会受到限制。
答案 1 :(得分:0)
或者为什么不继承
class MobileManager(object)
def __init__(self):
self.mobileLib = MobileLib()
def AddToPush(self, args, platform=None):
self.mobileLib.AddToPush(args, platform)
class Android(MobileManager):
def __init__(self):
MobileManager.__init__(self)
def AddToPush(self, args):
MobileManager.AddToPush(args, platform="android")
答案 2 :(得分:0)
动态方法通常是错误的方法,导致代码混乱。
在这里,我会这样做:
class Mobile(object):
def add_to_push(self, args):
....
def del_from_push(self, args):
...
def get_push_methods(self, args):
...
在你的经理中:
class MobileManager(object):
def __init__(self):
self.android = Mobile()
self.blackberry = Mobile()
self.iphone = Mobile()
现在,您可以写manager.mobileLib.add_to_push(args, 'android')
而不是manager.android.add_to_push(args)
。
如果您有平台变量,您甚至可以动态调度:getattr(manager, platform).add_to_push(args)
。
如果您想要3种类型平台的不同行为,您可以创建Mobile的子类(可能是AndroidMobile,BlackberryMobile和IPhoneMobile)。
当出现一个新平台(可能是windows7)时,很明显如何更改代码来支持它。