8

假设我使用该方法定义了以下类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__指的是模块而不是方法名称吗?有没有一种简单的方法来获取方法名称?

非常感谢

4

7 回答 7

11

这就是你所追求的:


from inspect import currentframe, getframeinfo

class MyClass:
    def foo(self):
        print "My name is %s" % getframeinfo(currentframe())[2]
于 2010-02-08T14:20:04.927 回答
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"
于 2010-02-08T14:14:30.197 回答
3

__name__指的是模块,因为那是它应该做的。获得当前正在运行的函数的唯一方法是自省堆栈。

于 2010-02-08T14:15:45.940 回答
2

其他答案很好地解释了它,所以我提供了一个更具体的例子。

名称.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__

名称2.py

import name

输出

name in foo name
foo's name foo
name at top name

注意如何__name__引用模块的内置属性?__main__如果模块是直接运行的,或者是模块的名称(如果它是导入的)。

您应该已经浏览过该if __name__=="__main__":代码段。

你可以在这里找到相关的文档,去看看吧。祝你好运!:)

于 2010-02-08T14:23:40.633 回答
1

对检查模块使用内省。

import inspect

class MyClass:
    def foo(self):
        print "My name is %s" % inspect.stack()[0][3]
于 2010-02-08T14:23:24.297 回答
1

看看模块_inspect

尝试:

>>> import inspect
>>> def foo():
...     print inspect.getframeinfo(inspect.currentframe())[2]
...
>>> foo()
foo

或者:

>>> def foo2():
...     print inspect.stack()[0][3]
...
>>> foo2()
foo2
于 2010-02-08T14:26:19.533 回答
-2

这将做到:

(您需要参考self.__class__._name__。)

class MyClass:
    def foo(self):
        print "My name is %s" % self.__class__.__name__
于 2010-02-08T14:16:38.040 回答