Python 在类中生成动态方法
我想要一个动态方法的类 从这些阵列中:Python 在类中生成动态方法,python,python-2.7,code-generation,Python,Python 2.7,Code Generation,我想要一个动态方法的类 从这些阵列中: prefix = ['android','iphone','blackberry'] method = ['AddToPush','DelFromPush','GetPushMessages'] 我想创建一个类,如: class MobileManager(object) def __init__(self): self.mobileLib = MobileLib() def androidAddToPush(sel
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')
[...]
如何在运行时生成/创建这些方法?如果您的前缀/方法集是在init time定义的,您可以尝试以下操作:
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很快就会受到限制。如果您的前缀/方法集是在init time定义的,您可以尝试以下方法:
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很快就会受到限制。或者为什么不采用inherate
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")
或者为什么不吸入
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")
动态方法通常是错误的方法,导致代码混乱 在这里,我会这样做:
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.android.add\u-to\u-push(args,'android')
,而不是manager.android.add\u-to\u-push(args)
如果您有一个平台变量:getattr(manager,platform)。您甚至可以动态调度。将\u添加到\u推送(args)
如果你想让这三种平台有不同的行为,你可以创建Mobile的子类(可能是AndroidMobile、BlackberryMobile和IPhoneMobile)
当新平台出现时(可能是windows7),很明显如何更改代码以支持它。动态方法通常是错误的方法,导致代码混乱 在这里,我会这样做:
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.android.add\u-to\u-push(args,'android')
,而不是manager.android.add\u-to\u-push(args)
如果您有一个平台变量:getattr(manager,platform)。您甚至可以动态调度。将\u添加到\u推送(args)
如果你想让这三种平台有不同的行为,你可以创建Mobile的子类(可能是AndroidMobile、BlackberryMobile和IPhoneMobile)
当一个新平台出现时(可能是windows7),很明显如何更改代码以支持它。它会这样工作:self.mobileLib.method\u name(args,prefix)?在代码中有行:func=lambda self,args:self.mobileLib.AddToPush(args,prefix)'AddToPush'应该来自方法数组。它不会工作:1。从
func()
参数中删除self
(将其绑定到具体实例,而不是类)。2.所有func
将使用method\u name
的最后一个值setattr(self,prefix+method\u name,make\u func(getattr(self.mobileLib,method\u name,prefix))
应该修复它,其中make\u func=lambda func,prefix:lambda args:func(args,prefix)
这个正在工作make_func=lambda func,prefix_name:lambda args:func(args,prefix_name)setattr(self,prefix_name+method_name,make_func(getattr(self.mobileLib,method_name),prefix_name))
非常感谢!它是这样工作的:self.mobileLib.method_name(args,prefix)?在代码中有行:func=lambda self,args:self.mobileLib.AddToPush(args,prefix)'AddToPush'应该来自方法数组。它不能工作:1。从func()
参数中删除self
(将其绑定到具体实例,而不是类)。2.所有func
将使用method\u name
的最后一个值setattr(self,prefix+method\u name,make\u func(getattr(self.mobileLib,method\u name,prefix))
应该修复它,其中make\u func=lambda func,prefix:lambda args:func(args,prefix)
这个正在工作make_func=lambda func,prefix_name:lambda args:func(args,prefix_name)setattr(self,prefix_name+method_name,make_func(getattr(self.mobileLib,method_name),prefix_name))
非常感谢!