如何从Python中的类中获取对象的名称?

How to get the name of an object from a class in Python?

本问题已经有最佳答案,请猛点这里访问。

我知道这是个奇怪的主意。这个想法是这样的:

1
2
3
class AnyClass:
    def __init__(self):
        # print object name

然后创建一个新对象

1
test = AnyClass()

最后得到这个输出:

1
'test'

这不是背后的想法,而是一个简单的例子,我想…

附言:我不想得到类名,只想得到对象名(如果可能的话)。PS2:我知道我可以用test.__name__来取这个名字,但我想把这个名字放在班里,而不是放在外面。


考虑一下:

1
2
>>> a = dict()
>>> b = a

ab都引用了完全相同的对象。

1
2
>>> a is b
True

当您对一个对象执行.操作时,您正在查找该对象的一个属性。一个对象可以在许多不同的位置被引用;存储所有这些引用名称是没有意义的,特别是当这些名称只绑定在特定的上下文中时。例如

1
2
3
4
5
def generator():
    a = dict()
    yield a

b = next(generator())

ab都指同一个dict对象,但除了在生成函数中,不能用a指代dict对象。

在特定的上下文中,可以测试绑定的名称,并查看它们是否引用特定的对象。

1
2
3
4
5
test = MyObject()

for name, obj in locals().items():
    if test is obj:
        print name


第一:你不想这样做,没有理由这样做,如果你认为你需要这样做,你就错了。

第二:在__init__方法中不能这样做,因为引用新AnyClass实例对象的名称引用test尚未添加到内存空间("绑定")。但是,你可以这样做。

1
2
3
4
5
6
class AnyClass():
    def echo_name(self):
        {v:k for k,v in locals().items()}[self]

test = AnyClass()
test.echo_name()

这将返回分配给test对象的locals()字典中遇到的第一个变量。无法保证返回这些变量的顺序。

为了进一步解释为什么在执行此操作时,__init__方法不起作用:

1
test = AnyClass()

根据类定义的说明(包括任何父类或元类的定义)构造AnyClass的新实例。这种构造分阶段进行,最后一个阶段是执行__init__方法。在__init__之前,如果存在将要执行的其他方法,则为__new__,以及元类的__new____init____call__方法(如果存在)。

因此,在执行__init__方法体中的代码时,对象仍在构造中。因此,到目前为止,在locals()字典中还没有指定'test'这个名字。只有一个叫'self'的成员。显然,如果您在locals()字典中反向查找self对象以查找注册名称,您将得到的名称是'self'名称。哪个…没用。