How to get the name of an object from a class in Python?
我知道这是个奇怪的主意。这个想法是这样的:
1 2 3
| class AnyClass:
def __init__(self):
# print object name |
然后创建一个新对象
最后得到这个输出:
这不是背后的想法,而是一个简单的例子,我想…
附言:我不想得到类名,只想得到对象名(如果可能的话)。PS2:我知道我可以用test.__name__来取这个名字,但我想把这个名字放在班里,而不是放在外面。
- 要引用对象的变量名吗?该类如何知道它分配给了什么变量?
- 对象没有名称;名称指的是对象。
- test对象在AnyClass()时不存在,由于test在__init__()被调用时不存在,我认为没有办法知道它的名字。
- @板球007我不知道…我想这是不可能的:(
- 除了作为对python解释器中内存位置的引用之外,本地变量名不会存储在任何地方;因为这些名称在运行时被分配到内存位置,而python没有元解释抽象,所以我认为这是不可能的。
- @Licorna我是这么想的,但是在创建对象时可以检查它的名称,以检查名称是否遵循某些规则,例如。
- 如果有两个变量引用同一个对象呢?
- 我想这可能是通过循环局部变量来寻找对相关类的引用(可以选择下降到容器中),但是无论是什么使您认为这是必要的,只要重新考虑它。
- 你对x= test = yellow = MyClass()有什么期望?
- 这几乎肯定是一个xy问题。再问一个问题,描述你到底在做什么。
- 在你评论过的地方,对象名是"self",这是你当时唯一需要知道的名称。
考虑一下:
1 2
| >>> a = dict()
>>> b = a |
a和b都引用了完全相同的对象。
当您对一个对象执行.操作时,您正在查找该对象的一个属性。一个对象可以在许多不同的位置被引用;存储所有这些引用名称是没有意义的,特别是当这些名称只绑定在特定的上下文中时。例如
1 2 3 4 5
| def generator():
a = dict()
yield a
b = next(generator()) |
a和b都指同一个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__方法不起作用:
根据类定义的说明(包括任何父类或元类的定义)构造AnyClass的新实例。这种构造分阶段进行,最后一个阶段是执行__init__方法。在__init__之前,如果存在将要执行的其他方法,则为__new__,以及元类的__new__、__init__和__call__方法(如果存在)。
因此,在执行__init__方法体中的代码时,对象仍在构造中。因此,到目前为止,在locals()字典中还没有指定'test'这个名字。只有一个叫'self'的成员。显然,如果您在locals()字典中反向查找self对象以查找注册名称,您将得到的名称是'self'名称。哪个…没用。
- 我想你的意思是[self],而不是[test]。这应该在__init__()方法中。不过,我认为它无论如何都不会起作用。
- @Zondo我没想到它是在__init__方法中——你说得对,甚至不起作用。
- @Zondo现在修好了。