如何使用Python中的方法引用方法名称?

时间:2010-02-08 14:05:29

标签: python methods introspection

假设我使用方法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__引用模块而不是方法名称? 有没有简单的方法来获取方法名称?

非常感谢

7 个答案:

答案 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)

查看the inspect module

尝试:

>>> 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__