Python中如何判断变量归属类/实例及删除类变量?
问题场景复现
先看这段示例代码:
class A: def __init__(self): self.one = 1 two = 2 a = A()
查看类和实例的属性字典:
>>> A.__dict__ mappingproxy({'__dict__': <attribute '__dict__' of 'A' objects>, '__doc__': None, '__init__': <function A.__init__ at 0x0000021520A2A290>, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'A' objects>, 'two': 2}) >>> a.__dict__ {'one': 1}
访问和删除属性时会发现,实例能访问类属性,但无法从实例层面删除类属性:
>>> a.one 1 >>> a.two 2 >>> del a.one >>> del a.two Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: two
一、判断变量属于类还是实例
有几种直接实用的方法:
- 检查属性字典
__dict__
类的__dict__(或用vars(A)获取)中存储的是类属性,实例的__dict__(vars(a))中存储的是实例属性。比如上面的two在A.__dict__里,属于类属性;one在a.__dict__里,属于实例属性。 - 结合
hasattr判断归属
如果hasattr(a, 'attr_name')为真,但'attr_name' not in a.__dict__,说明这个属性来自类(或父类)的类属性;反之如果在实例的__dict__中存在,就是实例属性。 - 区分可变对象的特殊情况
如果是列表、字典这类可变对象,实例如果没修改过属性值,会直接引用类属性的对象;一旦实例修改了这个属性,就会在自己的__dict__中生成一个新的实例属性,此时再看__dict__就能区分开。
二、删除类中的变量
直接针对类执行删除操作即可,有两种方式:
- 使用
del语句直接操作类:
del A.two
执行后,类A和所有它的实例都无法再访问two属性。
2. 使用delattr函数(适合动态删除场景):
如果属性名是字符串形式,或者需要根据变量动态指定属性名,可以用:
delattr(A, 'two')
效果和del A.two完全一致。
内容的提问来源于stack exchange,提问作者Stupid genius
相关产品推荐
相关产品推荐

