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

2024-10-06 11:23:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

然后创建一个新对象

^{pr2}$

最后得到这个输出:

'test'

这不是背后的想法,但这是一个简单的例子,我试图。。。在

PS:我不想获取类名,只想获取对象名(如果可能) PS2:我知道我可以用test.__name__来获取名称,但我试图在类内部而不是外部获取名称。在


Tags: 对象nametestself名称objectinitdef
2条回答

考虑一下这个:

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

a和{}引用了完全相同的对象。在

^{pr2}$

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

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

b = next(generator())

ab都引用同一个dict对象,但是除了生成器函数之外,不能使用a引用{}。在

如果你能在一个特定的测试中看到一个特定的名字。在

test = MyObject()

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

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

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

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

test = AnyClass()
test.echo_name()

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


要进一步解释为什么它在__init__方法中不起作用,请执行以下操作:

^{pr2}$

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

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

相关问题 更多 >