我想知道是否可以使用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
答案 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
)。这样,您就不会受到预先构建的文件列表的限制,根据您的应用程序,这些文件可能是也可能不合适。