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

如何查看Python单例对象属性及为何_instances不在dir返回结果中

为什么dir(Cls)看不到_instances属性

核心原因

两个基础逻辑解释这个现象:

  1. _instances是定义在元类Singleton上的类属性,并不是你实现的Cls类自身的属性,也不存在于Cls的__dict__里
  2. Cls本质是元类Singleton的实例,Python的属性查找规则是:访问实例属性时,先找实例自身的属性字典,没找到就去实例所属类的属性字典里找,所以你直接写Cls._instances可以正常拿到值
    而dir()函数对类对象做了特殊处理:当调用dir(类对象)时,只会返回该类自身、该类所有基类的属性,不会枚举它所属元类的属性,所以_instances不会出现在dir(Cls)的结果中。

查看_instances的方法

你可以通过以下两种方式直接看到该属性:

  1. 对Cls所属的元类调用dir():
# type(Cls) 就是元类 Singleton
>>> dir(type(Cls))
['__call__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_instances']
  1. 直接查看元类的属性字典:
>>> Singleton.__dict__
mappingproxy({'__module__': '__main__', '_instances': {<class '__main__.Cls'>: <__main__.Cls object at 0x7fb21270dc40>}, '__call__': <function Singleton.__call__ at 0x7fb21270f9a0>, '__doc__': None})

让dir(Cls)显示元类属性的方案

如果需要让dir(Cls)也能返回元类的属性,可以在元类中自定义__dir__方法,将元类的属性追加到返回结果中:

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]
    # 自定义__dir__方法,扩展返回结果
    def __dir__(cls):
        default_res = super().__dir__()
        # 追加元类的属性名
        meta_attrs = list(type(cls).__dict__.keys())
        return list(set(default_res + meta_attrs))

修改后再调用dir(Cls)就可以看到_instances了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:57:03