python,动态实现onthefly上的一个类

时间:2010-12-08 13:16:40

标签: python function interface methods add

假设我有一个实现多种方法的类。我们希望用户选择在现有方法中运行哪些方法,或者他可以决定在on_the_fly上添加任何方法。

来自示例

class RemoveNoise():
       pass

然后按需要添加方法

RemoveNoise.raw = Raw()
RemoveNoise.bais = Bias()
etc
他甚至可以写一个新的

def new():
   pass

并添加new()方法

RemoveNoise.new=new
run(RemoveNoise)

run()是一个评估这样一个类的函数。

我想保存class_with_the_methods_used并将此类链接到创建的对象。

有关如何在python中解决此问题的任何提示?

3 个答案:

答案 0 :(得分:6)

可以在运行时将函数添加到类中。

class Foo(object):
  pass

def bar(self):
  print 42

Foo.bar = bar
Foo().bar()

答案 1 :(得分:2)

没有必要解决,你就是这样做的。这是您的代码,需要进行少量更改:

class RemoveNoise():
       pass

RemoveNoise.raw = Raw
RemoveNoise.bias = Bias

def new(self):
   pass

RemoveNoise.new=new

instance = RemoveNoise()

就这么简单。 Python很精彩。

为什么你到底需要这个呢?但是。

答案 2 :(得分:0)

嗯,这里有一些代码可以做我认为你要求的东西 - 虽然当你写“我想要保存时,我不确定你的意思是”保存“ class_with_the_methods_used”。另请注意,如果来自不受信任的来源,对用户输入使用exec语句可能极其危险。

import copy

# an empty "template" class
class Generic():
    pass

# predefined functions that create common methods
def Raw():
    def raw(self):
        print 'in Raw method of instance', id(self)
    return raw

def Bias():
    def bias(self):
        print 'in Bias method of instance', id(self)
    return bias

def user_new_function(definition):
    tempdict = {}
    exec definition in tempdict
    return tempdict['new']

# create a new class
RemoveNoise = copy.deepcopy(Generic)
RemoveNoise.__name__ = 'RemoveNoise' # change the class name of the copy

# add a couple of predefined methods
RemoveNoise.raw = Raw()
RemoveNoise.bias = Bias()

# add user defined 'new' method
user_new_def = """\
def new(self):
    print 'in user defined method "new" of instance', id(self)
"""
RemoveNoise.new = user_new_function(user_new_def)

# create and use an instance of dynamically defined class
instance = RemoveNoise()
print 'RemoveNoise instance "{}" created'.format(id(instance))
# RemoveNoise instance "11974736" created
instance.raw()
# in Raw method of instance 11974736
instance.bias()
# in Bias method of instance 11974736
instance.new()
# in user defined method "new" of instance 11974736