Форум сайта python.su
внутри класса можно узнать название текущего класса:
class myClass(object):
def __init__(self):
print self.__class__.__name__
myClass()
Офлайн
можно, где то оно во фрейме закопано, вам вот сюдa
Офлайн
C mail.python.org:
>>> def get_called_name(depth=0):
... return sys._getframe(depth + 1).f_code.co_name
...
>>> class Hello:
... def __init__(self):
... print get_called_name()
...
>>> h = Hello()
__init__
>>>
Офлайн
К сожалению, не совсем верно.
Получается имя codeobject, а не function. По умолчанию они совпадают - питон делает их одинаковыми при создании.
Добраться из codeobject до function невозможно. Я делал это спец декоратором, который в globals() перед вызовом вставлял свои имена - и их можно было видеть внутри функции.
Короткая иллюстрация проблемы:
>>> class A(object):
... pass
...
>>> def f(self):
... return sys._getframe().f_code.co_name
...
>>> A.g = f
>>> a = A()
>>> a.g()
'f'
Офлайн
:)
можно попробовать так:
from new import function, instancemethod
from byteplay import Code, LOAD_CONST, STORE_FAST
from types import MethodType
class A(object):
def __getattribute__(self, name):
attr = super(A, self).__getattribute__(name)
if type(attr) is MethodType and not hasattr(attr.im_func, '_patched'):
c = Code.from_code(attr.func_code)
c.code[0:0] = [
(LOAD_CONST, name),
(STORE_FAST, '_func_name')]
f = function(c.to_code(), globals(), attr.__name__)
f._patched = True
attr = instancemethod(f, self, A)
setattr(self, name, attr)
return attr
def zzz(self):
print locals().get('_func_name')
def f(self):
print locals().get('_func_name')
A.g = f
a = A()
a.zzz()
a.zzz()
a.g()
Офлайн
Юра, примерно это я и делал в одной из версий своего декоратора.
Только использовал peak BytecodeAssembler. Если скорость не критична - globals выглядят чуть проще и меньше пугают народ :). Правда нужно было постоянно добавлять/удалять свое имя, что не очень красиво.
Похоже, при желании можно также заменить __getattribute__ на metaclass.
Собственно было интересно не столько само “правильное имя” сколько прочие custom значения из __dict__ функции (Удобный контейнер для всяких настроек).
И, к сожалению, получить этот __dict__ из code object (или сам function object) нельзя.
Офлайн