我知道这是一个奇怪的想法。这个想法是这样的:
class AnyClass:
def __init__(self):
# print object name
然后创建一个新对象
test = AnyClass()
最后得到这个输出:
'test'
这不是背后的想法,而是我正在努力的一个简单例子......
PS:我不是想获取类名,只是对象名称(如果可能)
PS2:我知道我可以用test.__name__
得到这个名字,但我试图在课堂上取名,而不是在外面。
答案 0 :(得分:3)
考虑一下:
>>> a = dict()
>>> b = a
a
和b
都引用完全相同的对象。
>>> a is b
True
当您对某个对象执行.
操作时,您需要在该对象上查找属性。可以在许多不同的位置引用对象;它存储所有这些引用名称是没有意义的,特别是当这些名称仅在某些上下文中绑定时。例如
def generator():
a = dict()
yield a
b = next(generator())
a
和b
都引用相同的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
。哪个......不是很有用。