我有一长串if语句正在检查对象(self)是否包含一系列可选属性。
举个例子:
if(hasattr(self, variableList)):
var1 = self.var1
if(hasattr(self, "var2")):
var2 = self.var2
if(hasattr(self, "var3")):
var3 = self.var3
if(hasAttr(self, "var4")):
var4 = self.var4
我试图弄清楚是否有一种使用for循环的简单方法,它会使用列表中的变量名来检查对象,如果它们存在则将它们本地存储在方法中,我认为这需要某种方式的字典。尝试以上是不好的做法?拥有更明确的列表或使用类似
之类的代码减少代码会更合适吗?for x in variableList:
if(hasattr(self,variableList[x]))
localvariable = variableList[x]
答案 0 :(得分:1)
这应该适合你:
var_list = ['var1', 'var2', 'var3'] # create list of variable string names
for var in var_list: # iterate over list of variable names
try:
# use exec to execute assignments, assuming attribute exists
exec('{0} = {1}'.format(var, getattr(self, var)))
except AttributeError: # catch the Exception if the attribute does not exist
exec('{0} = None'.format(var)) # set var to some default value, whatever
# is convenient for later code to check
# for and handle
正如其他人在评论中所建议的那样,你似乎正在使用一个奇怪的结构。在您的代码工作之后,我建议将其移至CodeReview并询问更好的方法来实现您的目标。没有看到你的其余代码,很难说,但我怀疑有更好的方法来实现你的总体目标。
答案 1 :(得分:1)
每个对象都有一个__dict__
属性,用于将实例成员存储在字典中。对于高度动态/内省的事物非常有用。例如:
class c():
def __init__(self):
self.a = 1
def test(self):
print self.__dict__
>>> o = c()
>>> o.test()
打印
{'a': 1}
编辑:getattr
可能是比__dict__
另一个有用的消息是locals()
是可以读写的局部变量字典。
例如:
>>> locals()["TEST"] = 1
>>> TEST
打印
1
从这两个事实来看,你应该能够做任何你想做的事情。它是否是一个好主意是一个完全不同的故事。 :)(我猜测它可能不是。请参阅@mgilson的评论)。