【问题标题】:How to get the variable name that instance the class? [duplicate]如何获取实例化类的变量名? [复制]
【发布时间】:2013-02-05 21:14:26
【问题描述】:

可能重复:
Getting an instance name inside class __init__()

我正在尝试解决这个问题:

class Test(object):
    def __init__(self):
        print "hello: %s" % i_dont_know

b = Test()
c = Test()

我想得到什么结果:

hello: b
hello: c

只是变量名。

我知道 id(self) 返回引用码,可以获取引用名吗?

【问题讨论】:

  • 我认为 vars 是您正在查看的内容,如果我的代码工作正常,我会发布答案
  • 不可能,而且一开始就是错误的问题。让你不需要它。
  • 在初始化时重要吗??
  • 因为它在__init__,你可能能够检查堆栈并拉出调用构造函数的代码行,然后从中解析变量名(在您上面的简单情况下)...但是我什至不会费心尝试编写该解决方案,因为您确实不需要这样做...

标签: python class object


【解决方案1】:

不,你不能。如果我这样做会怎样:

Test()

或者这个:

someList[3] = Test()

或者这个:

someList.append(Test())

【讨论】:

  • 另一个:a = b = c = Test()
  • a = Test(); b = a; somelist[3] = b; somedict[a] = set([a]); someobject.nested.attribute = a; del a?
  • 我知道这种可能性,我只是考虑检查全局变量或本地变量以快速完成我想做的事情。
【解决方案2】:

最好做类似的事情

class Test:
    def __init__(name):
        self.name = name


    def __str__():
        return name


a = Test("a")

print a    
>>> a

【讨论】:

    【解决方案3】:

    不,你不能。除了 BrenBarn 的例子之外,还有另一个无法克服的原因。构造函数在赋值发生之前完全执行

    查看字节码:

    >>> class Test(object): pass
    ... 
    >>> def make_instances():
    ...     a = Test()
    ...     b = Test()
    ... 
    >>> import dis
    >>> dis.dis(make_instances)
      2           0 LOAD_GLOBAL              0 (Test)
                  3 CALL_FUNCTION            0
                  6 STORE_FAST               0 (a)
    
      3           9 LOAD_GLOBAL              0 (Test)
                 12 CALL_FUNCTION            0
                 15 STORE_FAST               1 (b)
                 18 LOAD_CONST               0 (None)
                 21 RETURN_VALUE 
    

    CALL_FUNCTION 字节码是执行__init__ 的字节码。 STORE_FAST 将对象绑定到标识符。 Python 不提供与绑定交互的任何方式,因此没有可以使用的“特殊方法”。

    【讨论】:

    • 对我来说是完美的答案。
    猜你喜欢
    • 2013-03-30
    • 2012-03-18
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    相关资源
    最近更新 更多