你能从Python类中得到实例变量名吗?

本问题已经有最佳答案,请猛点这里访问。

我理解您不应该在程序中使用变量名,但我使用is严格用于调试目的,并希望将变量名传递给用户以提高可读性。

我有这样一个文件:

1
2
3
4
5
6
7
8
9
10
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)

这在Python中可行吗?


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

print undefined_variable

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

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

…它告诉您,调用它的变量的名称是'm':)

(您可以使用traceback模块做类似的事情,而不需要杀死程序。我尝试了几种方法,但是没有成功地使它在输出中包含m.foo()行。


您可以在实例的globals字典中查找将self作为值的项。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
>>>


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

1
2
3
4
5
6
class Man():
    def __init__(self):
        self.name ="Bob"
        self.color ="White"
m = Man()
    print dir(m)

这将打印出来:

['doc', 'init', 'module', 'color', 'name']

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