2012-11-20 116 views
1

這是我的代碼,我想用eval()來獲得規則狀態,但eval()需要局部變量,有很多繼承基類的類,所以我需要在每個類中重寫get_stat()如何創建本地動態變量

我想避免這種情況,一個想法是在get_stat()中創建動態變量,例如。 b類動態創建func中的變量a和b get_stat()

我應該如何在函數中創建動態可變參數?或以任何其他方式來避免這個愚蠢的想法。我使用Python 3.2.3,locals()不起作用

class base(object): 
    def check(self): 
     stat = get_stat() 
    def get_stat(self): 
     pass 

class b(base): 
    rule = 'a > 5 and b < 3' 
    a = 0 
    b = 0 

    def update_data(self, a, b): 
     self.a = a 
     self.b = b 

    def get_stat(self): 
     a = self.a 
     b = self.b 
     return eval(rule) 

class b(base): 
    rule = 'd > 5 and e < 3' 
    d = 0 
    e = 0 

    def update_data(self, d, e): 
     self.d = d 
     self.e = e 

    def get_stat(self): 
     d = self.d 
     e = self.e 
     return eval(rule) 
+0

我看不出有什麼動力在這裏!您仍然在爲每個班級重新編寫規則,您可能只需重寫函數 – vikki

+0

@vikki:我認爲它是動態的,因爲每個子類的'rule'屬性可以在-fly和'get_stat()'將返回基於當前值的結果。你說'規則'也可以作爲一種方法,儘管改變它的語法可能不像這樣方便或簡潔。 – martineau

回答

2

你可以通過字典來包含變量,以評估對錶達的eval()功能:

>>> eval("a + b", {"a": 2, "b": 3}) 
5 

通行證self.__dict__授予訪問權限的對象的屬性:

>>> class MyClass(object): 
...  def __init__(self): 
...    self.a = 2 
...    self.b = 3 
... 
>>> obj = MyClass() 
>>> obj.__dict__ 
{'a': 2, 'b': 3} 
>>> eval("a + b", obj.__dict__) 
5 

鏈接:

+0

我喜歡'vars(obj)'更好 –

+0

我認爲你應該清楚說明他們可以使用'return eval(rule,self .__ dict __)'或'return eval(rule,vars(self))'。 – martineau

+0

謝謝,這是我想要的 – xielingyun