현재 클래스의 이름을 가져오시겠습니까?
현재 수강 중인 수업의 이름은 어떻게 알 수 있습니까?
예:
def get_input(class_name):
[do things]
return class_name_result
class foo():
input = get_input([class name goes here])
인터페이스 중인 프로그램의 특성(비스트레일)으로 인해 사용할 수 없습니다.__init__()
초기화하기 위해input
.
obj.__class__.__name__
개체 이름이 표시되므로 다음 작업을 수행할 수 있습니다.
class Clazz():
def getName(self):
return self.__class__.__name__
용도:
>>> c = Clazz()
>>> c.getName()
'Clazz'
PEP 3155 소개__qualname__
Python 3.3에 구현되었습니다.
최상위 함수 및 클래스의 경우,
__qualname__
속성은 다음과 같습니다.__name__
기여하다.중첩 클래스, 메서드 및 중첩 함수의 경우__qualname__
특성에는 모듈 최상위 수준에서 개체로 이어지는 점선 경로가 포함되어 있습니다.
클래스 또는 함수의 정의 내에서 액세스할 수 있으므로, 예를 들어 다음과 같습니다.
class Foo:
print(__qualname__)
효과적으로 인쇄할 수 있습니다.Foo
정규화된 이름(모듈 이름 제외)을 얻을 수 있으므로, 다음과 같이 분할하는 것이 좋습니다..
성격.
그러나 정의 중인 클래스에 대한 실제 핸들을 가져올 수 있는 방법은 없습니다.
>>> class Foo:
... print('Foo' in globals())
...
False
클래스 본문 내에서 클래스 이름이 아직 정의되지 않아 사용할 수 없습니다.수업 이름만 간단히 타이핑할 수 없습니까?문제에 대해 좀 더 말씀해 주셔야 해결책을 찾을 수 있을 것 같습니다.
저는 당신을 위해 이 일을 할 수 있는 메타 클래스를 만들 것입니다.클래스를 만들 때 호출되며(개념적으로 클래스의 맨 끝에 있는 블록), 생성되는 클래스를 조작할 수 있습니다.테스트하지 않았습니다.
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 Batchelder
이것은 학급에서 작동하지 않을 것이지만, 어떤 방식으로든 작동할 것입니다.
편집: 네, 할 수 있습니다. 하지만 속임수를 써야 합니다.현재 실행 중인 클래스 이름이 호출 스택에 있으며 모듈을 통해 스택에 액세스할 수 있습니다.
>>> 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'
하지만, 저는 이것을 하지 않을 것입니다. 저의 원래 대답은 여전히 해결책으로 제가 선호하는 것입니다.원답:
아마도 가장 간단한 해결책은 장식가를 사용하는 것입니다. 이것은 메타 클래스를 포함하는 네드의 대답과 비슷하지만 덜 강력합니다. (장식가는 블랙 마법을 사용할 수 있지만 메타 클래스는 고대의 오컬트 블랙 마법을 사용할 수 있습니다.)
>>> 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'
>>>
@Yuval Adam은 @property를 사용하여 답변합니다.
class Foo():
@property
def name(self):
return self.__class__.__name__
f = Foo()
f.name # will give 'Foo'
제 생각에는, 다음과 같이 되어야 합니다.
class foo():
input = get_input(__qualname__)
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()
저는 python3.8을 사용하고 있으며 아래는 당신의 현재 클래스 이름을 얻기 위한 예시입니다.
class MyObject():
@classmethod
def print_class_name(self):
print(self.__name__)
MyObject.print_class_name()
또는 @class 메서드 없이 사용할 수 있습니다.
class ClassA():
def sayhello(self):
print(self.getName())
def getName(self):
return self.__class__.__name__
ClassA().sayhello()
그것이 다른 사람들에게 도움이 되기를 바랍니다!!!
언급URL : https://stackoverflow.com/questions/6943182/get-name-of-current-class
'programing' 카테고리의 다른 글
fs.readFileSync() 파일을 캡처하지 않는 방법은 무엇입니까? (0) | 2023.09.04 |
---|---|
json 수신 및 spring mvc 컨트롤러에서 객체 목록으로 역직렬화 (0) | 2023.09.04 |
Swift용 Xcode에서 코드 포맷터를 사용하는 방법은 무엇입니까? (0) | 2023.09.04 |
DBMS_OUTPUT에서 출력 버퍼를 가져오는 중입니다.C#의 GET_LINES (0) | 2023.09.04 |
mysql / Maria DB 대소문자 구분 검색 (0) | 2023.09.04 |