Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python中的方法从中引用方法名?_Python_Methods_Introspection - Fatal编程技术网

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

如何使用Python中的方法从中引用方法名?,python,methods,introspection,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

假设我使用方法
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
有人能解释一下为什么
\uuu name\uu
指的是模块而不是方法名吗? 有没有一种简单的方法来获取方法名


非常感谢

名称总是指局部变量,或者(如果不存在)指全局变量。有一个全局_名称_,它具有模块的名称

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"

\uuuuu name\uuuuuu
指的是模块,因为。获取当前正在运行的函数的唯一方法是内省堆栈。

这样做:

(您需要参考
self.\uuuuuu class.\uuuuu.\uu name.\uuuuuu


这就是你想要的:


from inspect import currentframe, getframeinfo

class MyClass:
    def foo(self):
        print "My name is %s" % getframeinfo(currentframe())[2]

在模块中使用内省


其他答案解释得很好,所以我举了一个更具体的例子

name.py

def foo():
    print "name in foo",__name__

foo()
print "foo's name",foo.__name__
print "name at top",__name__
import name
输出

name in foo __main__
foo's name foo
name at top __main__
name in foo name
foo's name foo
name at top name
name2.py

def foo():
    print "name in foo",__name__

foo()
print "foo's name",foo.__name__
print "name at top",__name__
import name
输出

name in foo __main__
foo's name foo
name at top __main__
name in foo name
foo's name foo
name at top name
注意
\uuuu name\uuuuu
如何引用模块的内置属性?如果模块直接运行,则为
\uuuuuu main\uuuuu
,如果模块已导入,则为模块名称

您应该已经运行了
if\uuuuuu name\uuuuu==“\uuuuu main\uuuuu”:
代码段

你可以找到,去看看。祝你好运!:)

看一看

尝试:

或:


如示例所示,所需的行为是打印“foo”(方法名称)而不是“MyClass”。为什么需要这样做?你在解决什么问题?虽然这是正确的,但没有理由喜欢在函数体中键入“foo”,而不从OP中获取更多信息。酷,想知道是否有人可以制作一个装饰器来实现这一点。。。至少在运行修饰方法之后。也许你可以检查修饰过的方法。@Skurmedel:
def with_name(fn):返回lambda*args,**kwds:fn(fn.\uu name_uu,*args,**kwds)
(吃那个,所以注释格式)你必须更改函数才能知道它正在被包装(名称是第一个arg,self/cls是第二个)。是的,那就可以了。。。。可能在之前或之后打印fn.\uuuu name\uuuu。我不知道他到底想要什么:)你认为装饰师会怎么做?一个函数已经有了
\uuuuu name\uuuuuuu
属性,问题是它很难从函数本身访问(如果我正确理解了这个问题)。@Skurmedel:这总是可能的,而且对它们的伤害比对我的伤害更大(通过向上投票,对我来说这是净赢,甚至是可玩的),但是如果我错过了什么,我真的很想知道这件事。是的,我明白,只要有人也陈述他们的担忧,我就可以接受否决票。@Roger Pate:如果我更改了方法名,我就不想花时间跟踪和更改方法中出现的每个方法名。例如,考虑日志记录或调试语句,您更喜欢:“输入方法:FO”V/S“进入方法:%s”%Sunt.STACK()(0)[ 3 ]。