etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2022. 1. 6. 11:11
반응형

질문자 :Dan


이 작업을 수행하는 함수가 인스턴스의 클래스가 파생된 기본 클래스인 경우 Python에서 개체의 인스턴스를 생성한 클래스의 이름을 어떻게 찾을 수 있습니까?

inspect 모듈 이 여기에서 나를 도왔을 수도 있다고 생각했지만 내가 원하는 것을 제공하지 않는 것 같습니다. __class__ 멤버를 구문 분석하지 않으면 이 정보를 얻는 방법을 모르겠습니다.



클래스 __name__ 속성 을 사용해 보셨습니까? 즉, type(x).__name__ 은 클래스의 이름을 제공할 것입니다.

 >>> import itertools >>> x = itertools.count(0) >>> type(x).__name__ 'count'

여전히 Python 2를 사용하는 경우 위의 방법은 새로운 스타일 클래스 에서만 작동합니다(Python 3 이상에서는 모든 클래스가 "new-style" 클래스임). 코드에서 일부 구식 클래스를 사용할 수 있습니다. 다음은 둘 다에 대해 작동합니다.

 x.__class__.__name__

sykora

클래스 이름을 문자열로 지정하시겠습니까?

 instance.__class__.__name__

truppo

type() ?

 >>> class A: ... def whoami(self): ... print(type(self).__name__) ... >>> >>> class B(A): ... pass ... >>> >>> >>> o = B() >>> o.whoami() 'B' >>>

GHZ

class A: pass a = A() str(a.__class__)

위의 샘플 코드(대화형 인터프리터에 입력할 때)는 __name__ 속성이 호출될 때 생성되는 'A' 와 반대로 '__main__.A' A.__class__ 의 결과를 str 생성자에 전달하기만 하면 구문 분석이 자동으로 처리됩니다. 그러나 더 명시적인 것을 원할 경우 다음 코드를 사용할 수도 있습니다.

 "{0}.{1}".format(a.__class__.__module__,a.__class__.__name__)

이 동작은 동일한 이름을 가진 클래스가 별도의 모듈에 정의되어 있는 경우 선호될 수 있습니다.

위에 제공된 샘플 코드는 Python 2.7.5에서 테스트되었습니다.


Jonathan

파이썬 2에서는

 type(instance).__name__ != instance.__class__.__name__ # if class A is defined like class A(): ... type(instance) == instance.__class__ # if class A is defined like class A(object): ...

예시:

 >>> class aclass(object): ... pass ... >>> a = aclass() >>> type(a) <class '__main__.aclass'> >>> a.__class__ <class '__main__.aclass'> >>> >>> type(a).__name__ 'aclass' >>> >>> a.__class__.__name__ 'aclass' >>> >>> class bclass(): ... pass ... >>> b = bclass() >>> >>> type(b) <type 'instance'> >>> b.__class__ <class __main__.bclass at 0xb765047c> >>> type(b).__name__ 'instance' >>> >>> b.__class__.__name__ 'bclass' >>>

Prasath

classmethod 데코레이터를 사용할 수 있습니다.

 class A: @classmethod def get_classname(cls): return cls.__name__ def use_classname(self): return self.get_classname()

사용법 :

 >>> A.get_classname() 'A' >>> a = A() >>> a.get_classname() 'A' >>> a.use_classname() 'A'

Yurii Rabeshko

좋은 질문.

다음은 누군가를 도울 수 있는 GHZ를 기반으로 한 간단한 예입니다.

 >>> class person(object): def init(self,name): self.name=name def info(self) print "My name is {0}, I am a {1}".format(self.name,self.__class__.__name__) >>> bob = person(name='Robert') >>> bob.info() My name is Robert, I am a person

RyanN

__name__ 속성을 얻는 것 외에도 주어진 클래스/함수에 대한 정규화된 이름이 필요할 수도 있습니다. __qualname__ 유형을 가져옴으로써 수행됩니다.

대부분의 경우 이들은 정확히 동일하지만 중첩된 클래스/메서드를 처리할 때 얻는 출력이 다릅니다. 예를 들어:

 class Spam: def meth(self): pass class Bar: pass >>> s = Spam() >>> type(s).__name__ 'Spam' >>> type(s).__qualname__ 'Spam' >>> type(s).Bar.__name__ # type not needed here 'Bar' >>> type(s).Bar.__qualname__ # type not needed here 'Spam.Bar' >>> type(s).meth.__name__ 'meth' >>> type(s).meth.__qualname__ 'Spam.meth'

자기 성찰은 당신이 추구하는 것이기 때문에 항상 고려하고 싶을 수 있습니다.


Dimitris Fasarakis Hilliard

함수 또는 클래스의 정규화된 이름을 나타내는 __qualname__ 을 사용하면 됩니다.

예시:

 >>> class C: ... class D: ... def meth(self): ... pass ... >>> C.__qualname__ 'C' >>> CD__qualname__ 'CD' >>> CDmeth.__qualname__ 'CDmeth'

문서 링크 qualname


Lalit Vavdara

인스턴스 클래스 이름을 얻으려면:

 type(instance).__name__

또는

 instance.__class__.__name__

둘 다 똑같다


v.babak

출처 : http:www.stackoverflow.com/questions/510972/getting-the-class-name-of-an-instance

반응형