이 작업을 수행하는 함수가 인스턴스의 클래스가 파생된 기본 클래스인 경우 Python에서 개체의 인스턴스를 생성한 클래스의 이름을 어떻게 찾을 수 있습니까?
inspect 모듈 이 여기에서 나를 도왔을 수도 있다고 생각했지만 내가 원하는 것을 제공하지 않는 것 같습니다. __class__
멤버를 구문 분석하지 않으면 이 정보를 얻는 방법을 모르겠습니다.
질문자 :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__
클래스 이름을 문자열로 지정하시겠습니까?
instance.__class__.__name__
type()
?
>>> class A: ... def whoami(self): ... print(type(self).__name__) ... >>> >>> class B(A): ... pass ... >>> >>> >>> o = B() >>> o.whoami() 'B' >>>
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에서 테스트되었습니다.
파이썬 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' >>>
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'
좋은 질문.
다음은 누군가를 도울 수 있는 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
__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'
자기 성찰은 당신이 추구하는 것이기 때문에 항상 고려하고 싶을 수 있습니다.
함수 또는 클래스의 정규화된 이름을 나타내는 __qualname__
을 사용하면 됩니다.
예시:
>>> class C: ... class D: ... def meth(self): ... pass ... >>> C.__qualname__ 'C' >>> CD__qualname__ 'CD' >>> CDmeth.__qualname__ 'CDmeth'
문서 링크 qualname
인스턴스 클래스 이름을 얻으려면:
type(instance).__name__
또는
instance.__class__.__name__
둘 다 똑같다
출처 : http:www.stackoverflow.com/questions/510972/getting-the-class-name-of-an-instance
CSS 표시 속성의 전환 (0) | 2022.01.08 |
---|---|
저장 프로시저의 결과를 임시 테이블에 삽입 (0) | 2022.01.08 |
배열의 경우 a[5] == 5[a]인 이유는 무엇입니까? (0) | 2022.01.06 |
getter 및 setter/접근자를 사용하는 이유는 무엇입니까? (0) | 2022.01.06 |
객체를 멤버로 사용하여 일반 JavaScript 객체를 반복하는 방법 (0) | 2022.01.06 |