我有一个字符串列表[' foo1',' foo2',...],它们代表我想要从self中删除的变量,如果它们是self的一部分。什么是Pythonic和紧凑的方法呢?
我的第一次尝试是
if hasattr(self, 'foo1'):
del self.foo1
if hasattr(self, 'foo2'):
del self.foo2
...
但对于大型列表而言,这显然不具备可扩展性。
有人可以帮忙吗?
答案 0 :(得分:10)
您可以在对象的for
上使用pop
,同时使用__dict__
循环提升效果:
for attr in ('foo1','foo2'):
self.__dict__.pop(attr,None)
pop
基本上检查元素是否在字典中,如果是这种情况则删除它(它也返回相应的值,但这里不相关)。我们在这里使用None
作为"默认"返回值,如果密钥不存在,pop
将不会出错。
答案 1 :(得分:5)
您可以使用delattr
。如果属性不存在,它将引发AttributeError
,因此如果需要,可以将其包装在方法中:
def safe_delattr(self, attrname):
if hasattr(self, attrname):
delattr(self, attrname)
或使用try / except块:
try:
delattr(self, attrname)
except AttributeError:
pass
这样做的好处是可以使用定义__slots__
的类,因为它们不会公开__dict__
属性。
答案 2 :(得分:2)
你可以很容易地做到这一点,但我不得不说乍一看似乎是一个非常奇怪的要求。通常在Python中涉及动态创建和/或删除变量的任何东西都是代码气味,所以我对需求的出现(以及您的描述是否可能不会掩盖真正的问题)感兴趣。
但请记住,实例变量存储在class SayHello(object):
def print_args(self, arg1, arg2):
print (arg1, arg2)
if __name__ == "__main__":
foo = SayHello()
foo.print_args(sys.argv[1], sys.argv[2])
中,并假设您的字符串列表被称为self.__dict__
,您可以使用此类内容执行您想要的操作
los
答案 3 :(得分:1)
def del_attr(self, list):
for l in list:
delattr(self, l)
答案 4 :(得分:0)
循环运行吗?
var_names = ["foo1", "foo2", "foo3"]
for var_name in var_names:
delattr(self, var_name)
答案 5 :(得分:0)
有delattr(),虽然我无法想到删除对象属性很有用的很多情况。