Здесь у вас есть рабочее решение для вашего конкретного случая, но будьте осторожны (я написал его главным образом, чтобы продемонстрировать, что действительно возможно сделать что-то подобное):
- Вы не должны его использовать
- Это очень специфично
- У него много ограничений
- Мне было просто весело с этим
- Это черная магия
- Этоможет не работать в вашем случае использования
- Это не потокобезопасно
- Я уже говорил, что вы не должны его использовать?
В любом случае, здесь у вас естькод:
import inspect
def NameAwareClassType():
frameInfo = inspect.getouterframes(inspect.currentframe())[1]
codeContext = frameInfo[4][0]
className = codeContext.split(' ', 1)[1].split('(', 1)[0]
class ClassNameGlobalRemoverType(type):
def __new__(mcs, name, bases, dict):
if name == className:
del globals()['__clsname__']
return type.__new__(mcs, name, bases, dict)
class NameAwareClass(object):
__metaclass__ = ClassNameGlobalRemoverType
globals()['__clsname__'] = className
return NameAwareClass
class A(NameAwareClassType()):
print __clsname__
def __init__(self):
pass
print __clsname__
Редактировать: https://gist.github.com/1085475 - там у вас есть версия, которая позволяет использовать __clsname__
во время выполнения метода;не имеет особого смысла, так как self.__class__.__name__
- лучший подход, а переменная __clsname__
больше не содержит строку (мне весело экспериментировать с этим)