目标: 执行__init__
变量(对象创建)后动态生成方法。执行__init__后动态生成方法
第一(未动力为例):
string_custom_method='''def custom_method(self):
print self.text'''
class Foo:
def __init__(self):
self.text='foo'
exec string_custom_method
Foo().custom_method()
这个脚本是非常简单,它的作品好。问题是,我居然需要自定义的string_custom_method
内容:
string_custom_method='''def custom_method(self):\n'''
def create_custom_method(print_end):
global string_custom_method
string_custom_method+='\t'+'print self.text\n'
if print_end:
string_custom_method+='\t'+'print "end"'
class Faa:
def __init__(self):
self.text='faa'
create_custom_method(True)
exec string_custom_method
Faa().custom_method()
的问题是,我得到以下错误:
def custom_method(self):
^
SyntaxError: unexpected EOF while parsing
所以我的结论是,蟒蛇读取方法的树前执行__init__
这在这种情况下是一个问题。
阅读一些有关这之后,我想,也许通过staticmethod
这样的:self.custom_method = staticmethod(...)
可以工作, 但问题是,custom_method
它没有在全球范围内定义,我无法定义它,直到__init__
是执行。
有没有什么办法让这项工作?我知道这个例子看起来不太有用,但我真的需要它来做我的程序!
你愿意解释一下你的真实* *使用情况,而不是这个虚拟实例吗?我认为你在这里有一个XY问题 - 他们当然是比使用exec更好的解决方案(提示:99.90%,exec和eval是错误的解决方案)。 –
@brunodesthuilliers这个虚拟示例解释了相当不错的问题,但没有发布100行我的程序。在我的程序“custom_method”中,它实际上是增加了多个条件和变量的循环。条件和变量并不总是有用的。它依赖于'__init __(self,var1,var2,var3)'定义的变量。如果删除无用的变量和条件,我会增加循环的速度,这是我需要的。 – rsm
那么,为什么你要以不必要的条件得到评估的方式编写代码呢?对于* actual *问题,可能有许多解决方案,可能是子类,方法提取,策略模式等等。但动态方法创建几乎肯定不是它。我同意@brunodesthuilliers,这似乎是一个XY问题。 –