programing

현재 클래스의 이름을 가져오시겠습니까?

lastmoon 2023. 9. 4. 20:33
반응형

현재 클래스의 이름을 가져오시겠습니까?

현재 수강 중인 수업의 이름은 어떻게 알 수 있습니까?

예:

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

반응형