假设我有一个实现多种方法的类。我们希望用户选择在现有方法中运行哪些方法,或者他可以决定在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中解决此问题的任何提示?
答案 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