如何使用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 ]。