2010-02-08 164 views
8

說我有一個方法foo定義以下類:如何使用Python中的方法引用方法名稱?

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

爲什麼你要這麼做?你解決什麼問題? – SilentGhost 2010-02-08 14:23:13

回答

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" 
+0

爲什麼downvote? – 2010-02-08 14:25:28

+0

可能是一個競爭性downvote。它發生在我身上。 – Skurmedel 2010-02-08 16:21:11

+1

@Skurmedel:這總是可能的,並且傷害他們比我更多(通過upvotes來回應它對我來說是淨勝,甚至是可以玩的),但是如果我錯過了某些東西,我真的很想知道它。 – 2010-02-08 16:27:18

-1

這將做到這一點:

(你需要參考self.__class__._name__

class MyClass: 
    def foo(self): 
     print "My name is %s" % self.__class__.__name__ 
+1

所需的行爲,如圖所示在這個例子中,打印'foo'(方法名稱)而不是'MyClass'。 – 2010-02-08 14:17:57

+0

Doh,對,沒有仔細閱讀這個問題。 – 0xfe 2010-02-08 14:22:46

11

這確實你以後:


from inspect import currentframe, getframeinfo 

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

雖然這是正確的,但沒有理由只是在功能體中輸入'foo'而沒有更多來自OP的信息。 – 2010-02-08 14:23:51

+0

很酷,不知道是否可以讓一個裝飾者這麼做......至少在裝飾好的方法已經運行之後。也許你可以檢查裝飾的方法。 – Skurmedel 2010-02-08 14:24:52

+0

@Skurmedel:'def with_name(fn):return lambda * args,** kwds:fn(fn .__ name__,* args,** kwds)'(吃那個,SO註釋格式化)你必須改變函數知道它被包裹了(這個名字是第一個arg,而self/cls是第二個)。 – 2010-02-08 14:26:38

1

使用內省與inspect模塊。

import inspect 

class MyClass: 
    def foo(self): 
     print "My name is %s" % inspect.stack()[0][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,去檢查出來。祝你好運! :)

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 
相關問題