你能从Python类中获取实例变量名吗?

时间:2015-08-23 05:00:57

标签: python class instance instance-variables

据我所知,你不应该在程序中使用变量名,但我使用的是严格用于调试目的,并且想要将变量的名称传达给用户以便于阅读。

我有一个这样的文件:

class MyClass(object):
    def __init__(self):
        pass

    def foo(msg=""):
        debug("Called from the %s instance.") #quazi-print function that only prints when a DEBUG variable is True.
        print(msg)

m = MyClass()
m.foo("Test")

我想从类本身中检索“m”实例变量名。虽然这仅仅是一个示例文件,但我使用它来向用户传达已在实例变量中的某个属性上创建原始套接字,并希望显示它的位置(即New socket at m.socket)< / p>

这对Python来说是否可行?

3 个答案:

答案 0 :(得分:1)

您可以查看实例的globals字典,找到将其self作为值的项目。

class Foo(object):
    def bar(self):
        return [k for k,v in globals().items() if v is self]
    def bah(self):
        d = {v:k for k,v in globals().items()}
        return d[self]

f = Foo()
g = Foo()

print f.bar(), g.bar()
print f.bah(), g.bah()

>>> 
['f'] ['g']
f g
>>> 

答案 1 :(得分:1)

这是一个非常愚蠢的方法,如果你不介意那个程序现在退出:将这一行添加到foo():

print undefined_variable

当你到达那里时,你得到一个像这样的堆栈跟踪:

Traceback (most recent call last): File "test.py", line 15, in <module> m.foo("Test") File "test.py", line 11, in foo print undefined_variable NameError: global name 'undefined_variable' is not defined

...它告诉你调用它的变量的名称是'm':)

(你可以使用traceback模块做这样的事情而不会杀死程序。我尝试了几种方法,但没有设法让它包括{{1}输出中的行。)

答案 2 :(得分:-1)

是。要获取类的所有成员,可以使用内置关键字“dir”。它将列出您班级中的所有方法和变量。如果使用正确的命名转换,您应该能够确定哪些名称是变量,哪些是方法。 Dir返回一个字符串列表。

class Man():
    def __init__(self):
        self.name = "Bob"
        self.color = "White"
m = Man()
    print dir(m)

这将打印出来:

[' doc ',' init ','模块','颜色','名称']

color和name不是这个类的实例变量名吗?