Скажите, что мне определили следующий класс с методом 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__
относится к модулю а не имени метода? Существует ли простой способ получить имя метода?
Большое спасибо
Это то, что вам нужно:
from inspect import currentframe, getframeinfo
class MyClass:
def foo(self):
print "My name is %s" % getframeinfo(currentframe())[2]
Имена всегда относятся к локальным переменным или (если таковая не существует) к глобальным переменным. Существует глобальное __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"
__name__
ссылается на модуль, потому что это то, что он должен делать. Единственным способом получить доступ к текущей выполняющейся функции было бы исследование стека.
Другие ответы объясняют это довольно хорошо, поэтому я предлагаю более конкретный пример.
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 __":
.
Вы можете найти соответствующие документы здесь , посмотрите их. Удачи! :)
Используйте интроспекцию с модулем inspect .
import inspect
class MyClass:
def foo(self):
print "My name is %s" % inspect.stack()[0][3]
Это поможет:
(Вам нужно обратиться к self.__class__._name__
.)
class MyClass:
def foo(self):
print "My name is %s" % self.__class__.__name__
Взгляните на проверить
модуль .
Попробуйте:
>>> import inspect
>>> def foo():
... print inspect.getframeinfo(inspect.currentframe())[2]
...
>>> foo()
foo
или:
>>> def foo2():
... print inspect.stack()[0][3]
...
>>> foo2()
foo2