在Python中访问实例的名称以进行打印

tel*_*tel 2 python printing string class-method

因此,作为"像计算机科学家一样思考"问题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)
Run Code Online (Sandbox Code Playgroud)

让我疯狂的是,我希望能够编写一个字符串方法,通过__str__书面下面的单元测试.我现在得到的是:

In <__main__.Kangaroo object at 0x4dd870>'s pouch there is: ['olfactory', 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

基本上,我想知道是否有一些我可以在kanga = Kangaroo上执行的功能,使得函数的输出是那5个字符,即函数(kanga) - >"kanga".

有任何想法吗?

编辑: 阅读第一个答案让我意识到有一种更简洁的方式来问我原来的问题.有没有办法重写__init__,以便下面的代码有效?

>>> somename = Kangaroo()
>>> somename.name
'somename'
Run Code Online (Sandbox Code Playgroud)

Joh*_*hin 6

为了正确看待您的请求,请说明您希望附加到此代码创建的对象的名称:

marsupials = []
marsupials.append(Kangaroo()) 
Run Code Online (Sandbox Code Playgroud)

这个经典的文章由effbot提供了一个很好的解释.

要在编辑中回答修改后的问题:不.

现在你已经在评论中说清楚并且说这个命名练习的目的是区分用于与你的可变默认参数相关的调试目的的对象:

至少在Python的CPython实现中,在任何给定时间,所有现有对象都有唯一的ID,可以通过它获得id(obj).这可能足以满足您的调试需求.请注意,如果删除了某个对象,则该ID(即内存地址)可以由后续创建的对象重用.