8

method で定義された次のクラスがあるとします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

他の答えはそれを非常によく説明しているので、私はより具体的な例で貢献します。

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__":スニペットに出くわしたはずです。

ここで関連するドキュメントを見つけることができます、それらをチェックしてください。幸運を!:)

于 2010-02-08T14:23:40.633 に答える
1

inspectモジュールでイントロスペクションを使用します。

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 に答える