【问题标题】:Getting the identifier name of an instance in python在python中获取实例的标识符名称
【发布时间】:2010-12-26 22:39:21
【问题描述】:

我什么都没找到。我想这样做而不在构造函数中传递名称。

class foo:
   pass
something = foo()

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

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

谢谢,

【问题讨论】:

  • 如果你这样做会有什么行为:bar(foo())?
  • 这很难以任何有意义的方式进行。对于简单的分配,this 应该可以工作。不过,它会因任何复杂的事情而中断。

标签: python


【解决方案1】:

即使你能做到——你做不到——这也是对语言的滥用。为了阅读您的代码的人的理智,请避免隐藏的“魔术”行为。 Python 程序员不会期望他们的局部变量名有意义并且实际上会暴露给外部代码。

【讨论】:

    【解决方案2】:

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

    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 的缘故,用大写首字母命名你的类:)

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-06
        相关资源
        最近更新 更多