从self中删除列表中存在的变量的Pythonic方法

从self中删除列表中存在的变量的Pythonic方法,python,attributes,del,Python,Attributes,Del,我有一个字符串列表['foo1','foo2',…],它们表示我想从self中删除的变量,如果它们是self的一部分。什么是一个蟒蛇和紧凑的方式来做这件事 我的第一次尝试是 if hasattr(self, 'foo1'): del self.foo1 if hasattr(self, 'foo2'): del self.foo2 ... 但是对于一个大的列表来说,这显然是不可伸缩的 有人能帮忙吗?在循环中运行它 var_names = ["foo1", "foo2", "fo

我有一个字符串列表['foo1','foo2',…],它们表示我想从self中删除的变量,如果它们是self的一部分。什么是一个蟒蛇和紧凑的方式来做这件事

我的第一次尝试是

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)

虽然我想不出有多少情况下删除对象的属性是有用的。

您可以使用
for
循环,同时通过在对象的
\u dict\u
上使用
pop
来提高性能:

for attr in ('foo1','foo2'):
    self.__dict__.pop(attr,None)
pop
基本上是检查元素是否在字典中,如果在字典中,则将其删除(它还返回相应的值,但这与此处无关)。这里我们还使用
None
作为“默认”返回值,这样,如果键不存在,
pop
将不会出错。

您可以使用。如果属性不存在,它将引发一个
AttributeError
,因此如果需要,您可以将其包装到一个方法中:

def safe_delattr(self, attrname):
    if hasattr(self, attrname):
        delattr(self, attrname)
或使用try/except块:

try:
    delattr(self, attrname)
except AttributeError:
    pass

这样做的好处是使用定义
\uuuuuu插槽的类,因为它们不公开
\uuuuu dict\uuuuu
属性

大概是这样的吧

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

你可以很容易地做到这一点,但我不得不说,乍一看,这似乎是一个相当奇怪的要求。通常在Python中,任何涉及动态创建和/或删除变量的内容都是一种代码味道,因此我对需求是如何产生的(以及您的描述是否没有掩盖真正的问题)感兴趣

但是请记住,实例变量存储在
self.\uuuu dict\uuuu
中,并且假设您的字符串列表被称为
los
,您可以用这样的东西做您想做的事情

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

为什么要这样做?可能是@Kevin的重复我有一个类,可以在初始化后修改(初始化的计算代价很高)。关于如何修改它,有一些特定的规则。我从self中删除的动机是,如果类修改不正确,并且这些变量/对象不再有效,则会销毁类中的变量/对象。也许,我应该把这个类分为父类和子类。@holdenweb如上所述,我没有意识到dict也有一个
pop
方法。我喜欢这个解决方案!或
尝试:。。。;除了AttributeError:…
for。请注意,WillemVanOlson使用
pop()的解决方案优于