使用eval定义Python类数据属性

时间:2013-11-21 22:42:30

标签: python class eval

我想知道是否可以使用eval来创建类数据属性。类似于以下代码:

class Test:
    def __init(self):
        matrix_names = ['F', 'B', 'H', 'Q', 'R', 'x', 'P']
        for matrix in matrix_names:
            print matrix
            operation = "self.%s = self.__matrix_read(%s)" %\
             (matrix, matrix)
            eval(operation)

    def __matrix_read(self, filename):
        return (read(".matrix/%s.csv"%filename))

在iPython中我得到:

File "<string>", line 1
   self.F = self.__matrix_read(F)
       ^
SyntaxError: invalid syntax

2 个答案:

答案 0 :(得分:7)

您可以在函数中使用setattr build:

class Test:
    def __init(self):
        matrix_names = ['F', 'B', 'H', 'Q', 'R', 'x', 'P']
        for matrix in matrix_names:
            print matrix
            setattr(self, matrix, self.__matrix_read(matrix))

答案 1 :(得分:3)

为此使用eval。如果您希望在运行时定义属性,则已存在其他更好的方法。

如果您想要在实例化时定义和构建属性,请按照setattr()中的建议使用@PasteBT's answer

如果您希望答案可以动态扩展,请使用__getattr__()(澄清其行为的良好答案here)。

例如:

class Test:
    def __init__(self):
        self.matrix_names = ['F', 'B', 'H', 'Q', 'R', 'x', 'P']

    def __matrix_read(self, name):
        return (read(".matrix/%s.csv"%filename))

    def __getattr__(self, name):
        if name in self.matrix_names:
            return self.__matrix_read(name)

或者,另一种方式(恕我直言清洁,但YMMV):

class Test:
    # note that this is only called if the attr does not exist
    def __getattr__(self, name):
        try:
            with open(".matrix/{0}.csv".format(name)) as f:
                return f.read()
        except IOError:
            raise AttributeError("{0} does not exist".format(name))

(在python 3中用IOError替换FileNotFoundError)。这样,您就不会受到预先构建的文件列表的限制,根据您的应用程序,这些文件可能是也可能不合适。