Ian*_*low 10 python allocation creation
是否有任何方法可以覆盖,允许我使用print语句/ pdb /等来跟踪每次分配我的类的实例?虽然取消了一些物体,但我似乎得到了一些从未有过的物体__setstate__或者__init__它们.我尝试覆盖__new__并打印出我所制作的每个对象的id __new__,但我仍然遇到带有永不打印的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__)
Run Code Online (Sandbox Code Playgroud)
一旦在主脚本中导入,我就在类的父类上调用replace_allocator.我的课程有一个习惯__new__,它也打印出id.
(这更多的是评论而不是答案.)
在Python 2.2中引用Guido的统一类型和类:
在某些情况下,无需调用即可创建新实例
__init__(例如,从pickle加载实例时).没有调用就无法创建新实例__new__(尽管在某些情况下你可以通过调用基类来逃避__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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1160 次 |
| 最近记录: |