擅长:python、mysql、java
<p>我不打算把这个贴出来,但如果你只想把它用于调试,那么你可以:</p>
<pre><code>import sys
class Kangaroo(object):
def __str__(self):
flocals = sys._getframe(1).f_locals
for ident in flocals:
if flocals[ident] is self:
name = ident
break
else:
name = 'roo'
return "in {0}'s pouch, there is {1}".format(name, self.pouch_contents)
kang = Kangaroo()
print kang
</code></pre>
<p>这依赖于CPython(AFAIK),不适用于生产代码。如果实例位于任何类型的容器中,它将不起作用,并且随时可能因任何原因而失败。不过,它应该对你有好处。在</p>
<p>它的工作原理是从堆栈框架中获取<code>f_locals</code>字典,该框架表示调用<code>print kang</code>的命名空间。<code>f_locals</code>的键是帧中变量的名称,因此我们只需循环遍历它并测试每个条目是否为<code>self</code>。如果是这样,我们<code>break</code>。如果<code>break</code>没有执行,那么我们找不到条目,循环<code>else</code>子句按请求分配值'roo'。在</p>
<p>如果您想从某种容器中取出它,您需要扩展它来查看<code>f_locals</code>中的任何容器。如果键是dictlike容器,则可以返回键;如果键是tuple或list,则返回索引。在</p>