假设我使用方法foo
定义了以下类:
class MyClass:
def foo(self):
print "My name is %s" % __name__
现在,当我致电foo()
时,我希望/想要看到这个打印出来的
My name is foo
但是我得到了
My name is __main__
如果我要将类定义放入名为FooBar
的模块中,我会得到
My name is FooBar
但是,如果我这样做
m = MyClass()
print m.foo.__name__
我完全得到了我想要的东西
My name is foo
有人可以帮助解释为什么__name__
引用模块而不是方法名称?
有没有简单的方法来获取方法名称?
非常感谢
答案 0 :(得分:11)
这就是您所追求的目标:
from inspect import currentframe, getframeinfo
class MyClass:
def foo(self):
print "My name is %s" % getframeinfo(currentframe())[2]
答案 1 :(得分:4)
名称始终引用局部变量或(如果不存在)然后是全局变量。有一个全局__name__,它具有模块的名称。
class MyClass:
def foo(self):
print "My name is %s" % MyClass.foo.__name__
当然,这是多余的,几乎完全没有意义。只需输入方法名称:
class MyClass:
def foo(self):
print "My name is %s" % "foo"
print "My name is foo"
答案 2 :(得分:3)
__name__
是指模块,因为that's what it's supposed to do。获取当前正在运行的函数的唯一方法是内省堆栈。
答案 3 :(得分:2)
其他答案解释得很清楚,所以我提供了一个更具体的例子。
<强> name.py 强>
def foo():
print "name in foo",__name__
foo()
print "foo's name",foo.__name__
print "name at top",__name__
<强>输出强>
name in foo __main__
foo's name foo
name at top __main__
<强> name2.py 强>
import name
<强>输出强>
name in foo name
foo's name foo
name at top name
注意__name__
如何引用模块的内置属性?如果直接运行模块,则为__main__
,如果导入模块,则为模块的名称。
您应该浏览if __name__=="__main__":
代码段。
您可以找到relevant docs here,然后查看它们。祝好运! :)
答案 4 :(得分:1)
对inspect模块使用内省。
import inspect
class MyClass:
def foo(self):
print "My name is %s" % inspect.stack()[0][3]
答案 5 :(得分:1)
尝试:
>>> import inspect
>>> def foo():
... print inspect.getframeinfo(inspect.currentframe())[2]
...
>>> foo()
foo
或:
>>> def foo2():
... print inspect.stack()[0][3]
...
>>> foo2()
foo2
答案 6 :(得分:-2)
这样做:
(您需要参考self.__class__._name__
。)
class MyClass:
def foo(self):
print "My name is %s" % self.__class__.__name__