현재 수업 이름을 어떻게 알 수 있습니까?
예:
def get_input(class_name):
[do things]
return class_name_result
class foo():
input = get_input([class name goes here])
내가 (vistrails) 인터페이스하고있는 프로그램의 특성으로 인해을 (를) __init__()
초기화 하는 데 사용할 수 없습니다 input
.
답변
obj.__class__.__name__
개체 이름을 가져 오므로 다음과 같이 할 수 있습니다.
class Clazz():
def getName(self):
return self.__class__.__name__
용법:
>>> c = Clazz()
>>> c.getName()
'Clazz'
답변
클래스 본문 내에서 클래스 이름이 아직 정의되지 않았으므로 사용할 수 없습니다. 단순히 수업 이름을 입력 할 수 없습니까? 해결책을 찾을 수 있도록 문제에 대해 더 많이 말해야 할 수도 있습니다.
이 작업을 수행하기 위해 메타 클래스를 만들 것입니다. 클래스 생성시 (개념적으로 class : block의 맨 끝에서) 호출되며 생성되는 클래스를 조작 할 수 있습니다. 나는 이것을 테스트하지 않았습니다.
class InputAssigningMetaclass(type):
def __new__(cls, name, bases, attrs):
cls.input = get_input(name)
return super(MyType, cls).__new__(cls, name, bases, newattrs)
class MyBaseFoo(object):
__metaclass__ = InputAssigningMetaclass
class foo(MyBaseFoo):
# etc, no need to create 'input'
class foo2(MyBaseFoo):
# etc, no need to create 'input'
답변
클래스의 개인 속성으로 액세스 할 수 있습니다.
cls_name = self.__class__.__name__
편집하다:
에서 말했듯 Ned Batcheler
이 이것은 클래스 본문에서는 작동하지 않지만 메서드에서는 작동합니다.
답변
PEP 3155가 도입 __qualname__
되었으며 Python 3.3에서 구현되었습니다.
최상위 함수 및 클래스의 경우
__qualname__
속성은 속성과 동일__name__
합니다. 중첩 된 클래스, 메서드 및 중첩 된 함수의 경우__qualname__
속성에는 모듈 최상위 수준에서 개체로 이어지는 점선 경로가 포함됩니다.
클래스 또는 함수의 정의 내에서 액세스 할 수 있습니다. 예를 들면 다음과 같습니다.
class Foo:
print(__qualname__)
효과적으로 인쇄 Foo
됩니다. 정규화 된 이름 (모듈 이름 제외)을 얻게되므로 .
문자 에서 분할 할 수 있습니다 .
그러나 정의되는 클래스에 대한 실제 핸들을 얻을 수있는 방법은 없습니다.
>>> class Foo:
... print('Foo' in globals())
...
False
답변
편집 : 예, 할 수 있습니다. 하지만 속임수를 써야합니다. 현재 실행중인 클래스 이름이 호출 스택에 있으며 traceback
모듈을 통해 스택에 액세스 할 수 있습니다.
>>> import traceback
>>> def get_input(class_name):
... return class_name.encode('rot13')
...
>>> class foo(object):
... _name = traceback.extract_stack()[-1][2]
... input = get_input(_name)
...
>>>
>>> foo.input
'sbb'
그러나 나는 이것을하지 않을 것이다. 내 원래 대답은 여전히 내가 선호하는 솔루션입니다. 원래 답변 :
아마도 가장 간단한 해결책은 데코레이터를 사용하는 것입니다. 이것은 메타 클래스를 포함하는 Ned의 대답과 비슷하지만 덜 강력합니다 (데코레이터는 흑 마법을 할 수 있지만 메타 클래스는 고대의 오컬트 흑 마법을 할 수 있습니다 ).
>>> def get_input(class_name):
... return class_name.encode('rot13')
...
>>> def inputize(cls):
... cls.input = get_input(cls.__name__)
... return cls
...
>>> @inputize
... class foo(object):
... pass
...
>>> foo.input
'sbb'
>>>
답변
import sys
def class_meta(frame):
class_context = '__module__' in frame.f_locals
assert class_context, 'Frame is not a class context'
module_name = frame.f_locals['__module__']
class_name = frame.f_code.co_name
return module_name, class_name
def print_class_path():
print('%s.%s' % class_meta(sys._getframe(1)))
class MyClass(object):
print_class_path()
답변
다음과 같아야한다고 생각합니다.
class foo():
input = get_input(__qualname__)