【发布时间】:2011-01-25 18:29:45
【问题描述】:
是否有任何方法可以让我使用打印语句/pdb/等来跟踪每次分配我的类的实例?在解开一些对象时,我似乎得到了一些从未调用过__setstate__ 或__init__ 的对象。我尝试覆盖__new__ 并打印出我在__new__ 中创建的每个对象的ID,但我仍然遇到具有从未打印过的ID 的对象。
编辑:这是我用于更改(检测)我的班级的__new__ 及其所有超类(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。我的班级有一个自定义的 __new__ 开头,它也会打印出 id。
【问题讨论】:
-
你确定它们是不同的实例吗?你检查过
id(instance)是否匹配? -
您是否尝试使用
Allocator(cls)作为类型转换?如果是这样,那就错了,因为在 Python 中它是对Allocator对象的构造函数调用,而.new部分将获得一个新的绑定方法实例。 -
罗什:是的。我的分配器函数显示了我打印出 id(instance) 的方式。后来,当我发现一个对象缺少一些应该由 setstate 或 init 添加的字段时,我也打印出它的 id。如果我在之前的打印输出中 grep 获取该 ID,则没有命中。
-
Apalala:我确实打算使用
Allocator(cls)作为Allocator对象的构造函数调用。用cls构造的Allocator的意义在于调用cls原来的__new__方法,并报告得到的对象实例的id。 -
迭代应该是
for parent in cls.__bases__。您不需要回退到cls.__base__。并且不要使用包罗万象的except:子句。他们总是咬你。
标签: python allocation creation