这个问题在这里已有答案:
我知道你不应该在程序中使用变量名,但我使用的是严格用于调试目的,并且为了便于阅读,我想将变量的名称传达给用户。
我有这样一个文件:
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来说可行吗?
您可以查看实例的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
>>>
这是一个非常愚蠢的方法,如果你不介意当时退出的程序:将此行添加到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
模块做这样的事情,而不会杀死程序。我已经尝试了几种方法,但没有设法让它在输出中包含m.foo()
行。)
是。要获取类的所有成员,可以使用内置关键字“dir”。它将列出您班级中的所有方法和变量。如果使用正确的命名转换,您应该能够确定哪些名称是变量,哪些是方法。 Dir返回一个字符串列表。
class Man():
def __init__(self):
self.name = "Bob"
self.color = "White"
m = Man()
print dir(m)
这将打印出来:
['doc','init','module','color','name']
颜色和名称不是此类的实例变量名称吗?