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))
非常感谢!