Как обратиться к имени метода от с методом в Python?

Скажите, что мне определили следующий класс с методом 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__ относится к модулю а не имени метода? Существует ли простой способ получить имя метода?

Большое спасибо

8
задан SilentGhost 9 February 2010 в 11:47
поделиться

7 ответов

Это то, что вам нужно:


from inspect import currentframe, getframeinfo

class MyClass:
    def foo(self):
        print "My name is %s" % getframeinfo(currentframe())[2]
11
ответ дан 5 December 2019 в 08:23
поделиться

Имена всегда относятся к локальным переменным или (если таковая не существует) к глобальным переменным. Существует глобальное __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"
4
ответ дан 5 December 2019 в 08:23
поделиться

__name__ ссылается на модуль, потому что это то, что он должен делать. Единственным способом получить доступ к текущей выполняющейся функции было бы исследование стека.

3
ответ дан 5 December 2019 в 08:23
поделиться

Другие ответы объясняют это довольно хорошо, поэтому я предлагаю более конкретный пример.

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 __": .

Вы можете найти соответствующие документы здесь , посмотрите их. Удачи! :)

2
ответ дан 5 December 2019 в 08:23
поделиться

Используйте интроспекцию с модулем inspect .

import inspect

class MyClass:
    def foo(self):
        print "My name is %s" % inspect.stack()[0][3]
1
ответ дан 5 December 2019 в 08:23
поделиться

Это поможет:

(Вам нужно обратиться к self.__class__._name__.)

class MyClass:
    def foo(self):
        print "My name is %s" % self.__class__.__name__
-2
ответ дан 5 December 2019 в 08:23
поделиться

Взгляните на проверить модуль .

Попробуйте:

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

или:

>>> def foo2():
...     print inspect.stack()[0][3]
...
>>> foo2()
foo2
1
ответ дан 5 December 2019 в 08:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: