如果变量存在于列表中,则从 self 中删除变量的 Pythonic 方法

Pythonic way to delete variable from self if it exists in a list

我有一个字符串列表 ['foo1'、'foo2'、...],它们表示我想从 self 中删除的变量(如果它们是 self 的一部分)。什么是 Pythonic 和紧凑的方式来做到这一点?

我的第一次尝试是

if hasattr(self, 'foo1'):
    del self.foo1
if hasattr(self, 'foo2'):
    del self.foo2
...

但这显然无法扩展到大型列表。

有人能帮忙吗?

运行它在循环吗?

var_names = ["foo1", "foo2", "foo3"]
for var_name in var_names:
    delattr(self, var_name)

delattr(),虽然我想不出很多删除对象属性有用的情况。

您可以使用 for 循环,同时通过在对象的 __dict__ 上使用 pop 提升性能

for attr in ('foo1','foo2'):
    self.__dict__.pop(attr,None)

pop 基本上检查元素是否在字典中,如果是则将其删除(它也 return 是相应的值,但这与此处无关)。我们在这里也使用 None 作为 "default" return 值,这样如果键不存在,pop 就不会出错。

您可以使用 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__ 属性。

也许是这样的?

def del_attr(self, list):
    for l in list:
        delattr(self, l)

您可以很容易地做到这一点,但我不得不说,乍一看这似乎是一个非常奇怪的要求。通常在 Python 中,任何涉及动态创建 and/or 变量删除的东西都是代码味道,所以我很想知道需求是如何出现的(以及您的描述是否可能掩盖了真正的问题)。

但请记住实例变量存储在 self.__dict__ 中,并假设您的字符串列表被称为 los 您可以用这样的方式做您想做的事

for s in los:
    if s in self.__dict__:
        del self.__dict__[s]