gpt4 book ai didi

python - 如果类有 __dict__ 变量,可以检查 obj.__dict__ 吗?

转载 作者:太空狗 更新时间:2023-10-30 00:18:09 27 4
gpt4 key购买 nike

我感兴趣的是是否有一种方法可以可靠地内省(introspection) Python 实例以查看它的 __dict__ 尽管程序员可能会在途中抛出任何障碍,因为这将帮助我调试问题,例如意外的引用循环和悬空资源,如打开的文件。

一个更简单的例子是:如果程序员将 keys() 隐藏在它自己的类后面,我如何才能看到 dict 子类的键?解决方法是手动调用 dict keys() 方法,而不是让继承调用子类版本的方法:

# Simple example of getting to the real info
# about an instance

class KeyHidingDict(dict):
def keys(self):
return [] # there are no keys here!

khd = KeyHidingDict(a=1, b=2, c=3)
khd.keys() # drat, returns []
dict.keys(khd) # aha! returns ['a', 'b', 'c']

现在我真正的问题是,我如何才能看到一个实例的 __dict__,无论程序员可能做了什么对我隐藏它?如果他们设置了一个 __dict__ 类变量,那么它似乎隐藏了从该类继承的任何对象的实际 __dict__:

# My actual question

class DunderDictHider(object):
__dict__ = {'fake': 'dict'}

ddh = DunderDictHider()
ddh.a = 1
ddh.b = 2
print ddh.a # prints out 1
print ddh.__dict__ # drat, prints {'fake': 'dict'}

如您所见,__dict__ 的这个错误值不会干扰实际的属性设置和获取,但它确实通过隐藏 误导了 dir() ab 并将 fake 显示为对象的实例变量。

同样,我的目标是编写一个工具来帮助我反省类实例,以便在我想知道为什么一组类实例占用如此多的内存或打开如此多的文件时看到“到底发生了什么”——以及即使上面的情况非常人为设计,找到解决它的方法会让工具一直工作,而不是说“工作得很好,除非你正在看的类有……[上面的异常情况的描述]。”

我原以为我可以用类似的东西绝对可靠地获取 __dict__:

dict_descr = object.__dict__['__dict__']
print dict_descr(ddh, DunderDictHider)

但结果是 object 没有 __dict__ 描述符。相反,subtype_dict() C 函数似乎单独附加到程序员创建的object 的每个子类;没有集中的方法来命名或获取描述符,以便可以手动将其应用于类隐藏它的对象。

任何想法,任何人? :)

最佳答案

我不确定我对这有多么简单感到满意:

>>> class DunderDictHider(object):
... __dict__ = {'fake': 'dict'}
...
>>> ddh = DunderDictHider()
>>> ddh.a = 1
>>> ddh.b = 2
>>>
>>> print ddh.a
1
>>> print ddh.__dict__
{'fake': 'dict'}

问题是类(class)作弊?解决这个问题!

>>> class DictUnhider(object):
... pass
...
>>> ddh.__class__ = DictUnhider
>>> print ddh.a
1
>>> print ddh.__dict__
{'a': 1, 'b': 2}

就是这样。但是,如果该类定义了任何插槽,这将完全失败。

>>> class DoesntHaveDict(object):
... __slots__ = ['a', 'b']
...
>>> dhd = DoesntHaveDict()
>>> dhd.a = 1
>>> dhd.b = 2
>>>
>>> print dhd.a
1
>>> dhd.__class__ = DictUnhider
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __class__ assignment: 'DoesntHaveDict' object layout differs from 'DictUnhider'
>>>

关于python - 如果类有 __dict__ 变量,可以检查 obj.__dict__ 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7511664/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com