在类中生成动态方法

时间:2011-12-30 09:05:15

标签: 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(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') 

   [...]

如何在运行时生成/创建这些方法?

3 个答案:

答案 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)时,很明显如何更改代码来支持它。