所以作为“像计算机科学家一样思考”中问题17.6的一部分,我写了一个叫做袋鼠的课程:

class Kangaroo(object):

    def __init__(self, pouch_contents = []):
        self.pouch_contents = pouch_contents

    def __str__(self):
        '''
        >>> kanga = Kangaroo()
        >>> kanga.put_in_pouch('olfactory')
        >>> kanga.put_in_pouch(7)
        >>> kanga.put_in_pouch(8)
        >>> kanga.put_in_pouch(9)
        >>> print kanga
        "In kanga's pouch there is: ['olfactory', 7, 8, 9]"
        '''

        return "In %s's pouch there is: %s" % (object.__str__(self), self.pouch_contents)

    def put_in_pouch(self, other):
        '''
        >>> kanga = Kangaroo()
        >>> kanga.put_in_pouch('olfactory')
        >>> kanga.put_in_pouch(7)
        >>> kanga.put_in_pouch(8)
        >>> kanga.put_in_pouch(9)
        >>> kanga.pouch_contents
        ['olfactory', 7, 8, 9]
        '''

        self.pouch_contents.append(other)

让我发疯的是,我希望能够编写一个字符串方法,它可以通过__str__下面的单元测试。我现在得到的是:
In <__main__.Kangaroo object at 0x4dd870>'s pouch there is: ['olfactory', 7, 8, 9]


有什么想法吗?
编辑:
阅读第一个答案让我意识到有一种更简洁的方式来问我原来的问题。?
>>> somename = Kangaroo()
>>> somename.name
'somename'

最佳答案

我不打算发布这个,但是如果你只想让它用于调试,那么这里是:

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

这依赖于CPython(AFAIK),不适合生产代码。如果实例位于任何类型的容器中,并且可能在任何时候由于任何原因而失败,那么它将不起作用。不过,它应该能帮到你。
它的工作原理是将f_locals字典从表示调用print kang的命名空间的堆栈帧中取出。f_locals的键是帧中变量的名称,因此我们只需循环遍历它并测试每个条目是否self。。如果未执行break,则找不到条目,loopsbreak子句将根据请求分配值“roo”。
如果你想从某种容器中取出它,你需要扩展它来查看else中的任何容器。如果是dictlike容器,则可以返回键;如果是tuple或list,则可以返回索引。

07-28 02:16
查看更多