【问题标题】:How to get the name of an object from a class in Python? [duplicate]如何从 Python 中的类中获取对象的名称? [复制]
【发布时间】:2016-07-17 08:11:47
【问题描述】:

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

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

然后创建一个新对象

test = AnyClass()

最后得到这个输出:

'test'

这不是背后的想法,而是我正在尝试的一个简单示例......

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

【问题讨论】:

  • 你想要引用对象的变量名吗?类如何知道它分配给了什么变量?
  • 对象没有名字;名称指的是对象。
  • 我想这可以通过循环访问本地人来寻找对相关类的引用(可选地下降到容器中),但无论是什么让你认为这是必要的,请重新考虑一下。
  • 你对x= test = yellow = MyClass()有什么期望?
  • 对象名称,在您评论的地方,是“自我”,这是您当时唯一需要知道的名称

标签: python class object


【解决方案1】:

考虑一下:

>>> 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

【讨论】:

  • 感谢您的回答^^
【解决方案2】:

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

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

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

test = AnyClass()
test.echo_name()

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


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

test = AnyClass()

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

所以在 __init__ 方法主体中的代码正在执行的时间点,对象仍在构造中。因此,到目前为止,locals() 字典中没有分配给名称 'test' 的任何内容。只有一个名为'self' 的成员。而且,很明显,如果您在locals() 字典中反向查找self 对象以查找注册名称,您将得到的名称是名称'self'。哪个...没有用。

【讨论】:

  • 我想你的意思是[self],而不是[test]。这应该在__init__() 方法中。不过,我不认为它会起作用。
  • @zondo 我错过了它在__init__ 方法中 - 你是对的,甚至不会工作。
猜你喜欢
  • 1970-01-01
  • 2011-09-08
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 2015-02-16
  • 2014-01-22
  • 1970-01-01
相关资源
最近更新 更多