目標: 執行__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問題。 –