从self中删除列表中存在的变量的Pythonic方法
我有一个字符串列表['foo1','foo2',…],它们表示我想从self中删除的变量,如果它们是self的一部分。什么是一个蟒蛇和紧凑的方式来做这件事 我的第一次尝试是从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
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()的解决方案优于