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

时间:2016-03-29 16:28:10

标签: python class object

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

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

然后创建一个新对象

test = AnyClass()

最后得到这个输出:

'test'

这不是背后的想法,而是我正在努力的一个简单例子......

PS:我不是想获取类名,只是对象名称(如果可能) PS2:我知道我可以用test.__name__得到这个名字,但我试图在课堂上取名,而不是在外面。

2 个答案:

答案 0 :(得分:3)

考虑一下:

>>> a = dict()
>>> b = a

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

>>> a is b
True

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

def generator():
    a = dict()
    yield a

b = next(generator())

ab都引用相同的dict对象,但您无法使用a来引用dict以外的其他地方在发电机功能。

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

test = MyObject()

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

答案 1 :(得分:1)

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

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

class AnyClass():
    def echo_name(self):
        {v:k for k,v in locals().items()}[self]

test = AnyClass()
test.echo_name()

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

进一步解释为什么它在__init__方法中不起作用,当你这样做时:

test = AnyClass()

根据类定义的指令(包括任何父类或元类的定义)构造AnyClass的新实例。这种结构分阶段进行,其最后阶段正在执行__init__方法。在__init__之前,将执行的其他方法({1}}以及__new____new____init__方法元类(如果存在)。

因此,在__call__方法正文中的代码正在执行时,该对象仍在构建中。因此,分配给名称__init__的{​​{1}}字典中没有任何内容。只有一个名为locals()的成员。而且,显然,如果您在'test'字典中反向查找'self'对象以查找注册名称,您将获得的名称是self。哪个......不是很有用。