2012-11-20 117 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