在python中获取实例的标识符名称

时间:2010-12-26 22:39:22

标签: python

我还没找到任何东西。我想这样做而不在构造函数中传递名称。

class foo:
   pass
something = foo()

我希望foo的每个实例都知道它的初始标识符名称。在这种情况下,我创建的foo()实例应该知道它的标识符是字符串“something”

我正在研究一个小api,这将是一个非常优雅的方法,不幸的是我没有看到这样的事情。

谢谢,

3 个答案:

答案 0 :(得分:4)

即使你能做到这一点 - 你也做不到 - 这将是对语言的滥用。为了让您阅读代码的人的理智,请避免隐藏的“魔法”行为。 Python程序员不希望他们的本地变量名有意义并实际暴露给外部代码。

答案 1 :(得分:4)

你做不到。创建对象完全独立于将对该对象的引用分配给某个命名变量。

foo().doSomething() - foo的一个实例没有绑定任何名称,可能在调用后立即收集垃圾。

a[1].moo = foo() - 又是什么名字?

a = foo()
b = a # is name of foo 'a' or 'b'? both point to the same instance
a = None # but 'a' is gone, so now the name is 'b'?..

OTOH,将名称传递给构造函数是无痛的:

my_foos = {}
for name in ('a', 'b', 'c'):
  my_foos[name] = foo(name)

如果由于某种原因不想更改构造函数,您甚至可能会粗鲁地分配实例属性:

my_foos = {}
for name in ('a', 'b', 'c'):
  a_foo = foo()
  a_foo.my_mame = name # here
  my_foos[name] = a_foo

如果你陷入了黑暗面,你最终可以将你的foos添加到全局命名空间: globals().update(my_foos) - 现在您拥有全局名称abc,每个名称都指向一个名称恰当的foo。

而且,为了foo的缘故,用大写首字母命名你的课程:)

答案 2 :(得分:2)

据我所知,在Python中,变量只是一个引用某个对象实例的名称。您可以有许多指向同一实例的名称;实例不知道它的名字(也不应该是,恕我直言);稍后可以重用相同的名称来指向完全不同的类中的其他实例。

鉴于Python data model很难理解为什么对象知道如何在某个命名空间中命名它是有用的。

您可以在类变量或其他容器中存储对实例的引用,但在Python中并不常见 - 因为名称空间是如此自然而优雅的容器。