如何找出对象在哪里被实例化?

Posted

技术标签:

【中文标题】如何找出对象在哪里被实例化?【英文标题】:How can I find out where an object has been instantiated? 【发布时间】:2013-01-02 23:53:55 【问题描述】:

我试图在运行时找出一个对象被实例化的位置,因为这样可以向我的库的用户提供非常有用的错误消息。

假设我们有以下代码:

import mylib

obj = mylib.MyClass()

obj 然后从mylib 传递给另一个类的实例,然后开始一段美妙的旅程。在某个地方,obj 导致了一些不好的事情发生,我想向用户指出 obj 被实例化的位置。

我希望我可以使用inspect 模块来找出实例化obj 的文件和行号。不幸的是,inspect.getsourcefileinspect.getsourcelines 不支持实例。是否存在不支持此功能的技术原因?

还有其他方法可以获得我正在寻找的数据吗?

【问题讨论】:

是不是太复杂了?当不好的事情发生时,为什么不做我们所有人(大概)做的事情呢?如:import traceback + try: ... 除了:traceback.print_exc() 【参考方案1】:

您可以在类的构造函数中记录这些信息:

import traceback

class MyClass(object):
   def __init__(self):
       self.traceback = traceback.extract_stack()[-2]

obj = MyClass()

print 'Instantiated in 0:1'.format(*obj.traceback)

【讨论】:

不幸的是,这对子类来说效果不佳,因为每一级继承都是一个新的堆栈框架,并且对于每个相关对象来说它可能不是恒定的。因此,可能需要一些额外的逻辑来确定要返回多少帧。当涉及到多重继承时,这变得更加复杂。【参考方案2】:

也许你想要这个??

In [1]: def checkinstance(prohibitedclass):
   ...:     import sys
   ...:     final_result=set()
   ...:     for x in sys._getframe(1).f_locals:
   ...:         if isinstance(sys._getframe(1).f_locals.get(x),prohibitedclass):
   ...:             final_str="instance of class %s is at: %s"%(prohibitedclass,sys._getframe(1).f_locals.get(x))
   ...:             final_result.add(final_str)
   ...:     return list(final_result)

In [2]: class not_allowedclass(object):
   ...:     pass

In [3]: checkinstance(not_allowedclass)
Out[3]: []

In [4]: nk=not_allowedclass()

In [5]: nk1=not_allowedclass()

In [6]: checkinstance(not_allowedclass)
Out[6]: 
["instance of class <class '__main__.not_allowedclass'> is at: <__main__.not_allowedclass object at 0x102dcdb10>",
 "instance of class <class '__main__.not_allowedclass'> is at: <__main__.not_allowedclass object at 0x102dcda90>"]

In [7]: nk
Out[7]: <__main__.not_allowedclass at 0x102dcda90>

In [8]: nk1
Out[8]: <__main__.not_allowedclass at 0x102dcdb10>

In [9]: 

【讨论】:

以上是关于如何找出对象在哪里被实例化?的主要内容,如果未能解决你的问题,请参考以下文章

依赖注入概念问题:在哪里实例化新对象以保存到数据库?

java中实例化方法是啥意思

C# 如何根据指定变量来实例化对象?

如何判断java的一个类能否继承另一个类? 还有在new实例化一个对象时候有啥限制,

java中的实例化对象有啥用???????

C++ 中,类的实例化对象是指啥?如果确保它的实例化对象只得一个?