You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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__就能区分开。

二、删除类中的变量

直接针对类执行删除操作即可,有两种方式:

  1. 使用del语句直接操作类:
del A.two

执行后,类A和所有它的实例都无法再访问two属性。
2. 使用delattr函数(适合动态删除场景):
如果属性名是字符串形式,或者需要根据变量动态指定属性名,可以用:

delattr(A, 'two')

效果和del A.two完全一致。


内容的提问来源于stack exchange,提问作者Stupid genius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:30:53