gpt4 book ai didi

python - 在 python 中跟踪对象分配

转载 作者:太空狗 更新时间:2023-10-29 19:25:56 25 4
gpt4 key购买 nike

是否有任何我可以覆盖的方法允许我使用 print 语句/pdb 等来跟踪每次分配我的类的实例?在 unpickling 一些对象时,我似乎得到了一些从未调用过 __setstate____init__ 的对象。我尝试覆盖 __new__ 并打印出我在 __new__ 中创建的每个对象的 ID,但我仍然遇到 ID 从未打印过的对象。

编辑:这是我用来改变(检测)__new__ 我的类及其所有父类(super class)的代码,object 本身除外:

class Allocator:
def __init__(self, my_class):
self.my_class = my_class
self.old_new = my_class.__new__

def new(self, * args, ** kargs):
rval = self.old_new(*args, ** kargs)
#rval = super(self.my_class,cls).__new__(cls)
print 'Made '+str(self.my_class)+' with id '+str(id(rval))
return rval

def replace_allocator(cls):
if cls == object:
return

setattr(cls,'__new__',Allocator(cls).new)
print cls.__base__

try:
for parent in cls.__base__:
replace_allocator(parent)
except:
replace_allocator(cls.__base__)

我在主脚本中导入类的父类时立即调用 replace_allocator。我的类(class)有一个自定义的 __new__ 开始,它也打印出 id。

最佳答案

(这更像是评论而不是答案。)

引用 Guido 的 Unifying types and classes in Python 2.2 :

There are situations where a new instance is created without calling __init__ (for example when the instance is loaded from a pickle). There is no way to create a new instance without calling __new__ (although in some cases you can get away with calling a base class's __new__).

如果您正在使用新式类(object 的后代),则应始终调用 __new__()。我不认为晦涩的案例“你可以通过调用基类的 __new__” 来偶然发生,尽管我不知道这些案例到底是什么。

再举个例子:

In [1]: class A(object):
...: def __new__(cls):
...: print "A"
...: return object.__new__(cls)
...:

In [2]: A()
A
Out[2]: <__main__.A object at 0xa3a95cc>

In [4]: object.__new__(A)
Out[4]: <__main__.A object at 0xa3a974c>

关于python - 在 python 中跟踪对象分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4797418/

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