2013-04-05 2 views
8

간단한 클래스를 가정하지 않습니다 확인?어떻게 변수가 클래스 객체 또는

간단한 해결책 :

if str(type(m)) == "<type 'classobj'>": 
    # do something 

하지만 난 그걸 확인하는 적어도 하나 개의 고전적인 방법이 생각합니다.

+1

위의 코드는'm '이 새 스타일 클래스이기 때문에'type (m)'에''를 인쇄하지 않습니다. ''이 인쇄됩니다. 클래식 클래스에 대해서만''를 얻을 것입니다. – abarnert

답변

12

2.x에서 클래스 개체는 type (새 스타일 클래스) 또는 classobj (클래식 클래스) 일 수 있습니다. type 유형은 내장되어 있지만 classobj 유형은 없습니다. 그래서, 어떻게 얻습니까? 이것이 바로 types 모듈의 용도입니다.

isinstance(MyClass, (types.TypeType, types.ClassType)) 

3.X에서, 당신은 너무 고전 클래스에 대해 걱정할 필요가 없습니다 :

isinstance(MyClass, type) 

을 직접 유형을 비교하려는 경우에도이 비교해서는 안됩니다 모든 개체는 str입니다. 비교 :

>>> class MyClassicClass: 
...  pass 
>>> str(type(MyClassicClass)) == "<type 'classobj'>" 
True 
>>> str("<type 'classobj'>") == "<type 'classobj'>" 
True 

당신은 거의 언제나 직접 객체를 비교할 수

>>> type(MyClassicClass) == types.ClassType 
True 
>>> "<type 'classobj'>" == types.ClassType 
False 

(그리고 당신이 정말로 어떤 이유로 문자열 표현을 비교해야 않는 매우 드문 경우에, 당신은 repr을 원하는

+0

완벽하게 미리 감사드립니다. – pylover

+1

이것은 훌륭한 대답입니다. +1 (더 할 수 있다면 더) – mgilson

+0

+1. 나는 단순함으로 Jochen의 답변을 좋아하지만 이것은 좋은 설명입니다. – Nitzle

3

이게 당신이 찾고 있는게 있나요?

>>> class A(object): 
... pass 
>>> isinstance(A, type) 
True 

>>> isinstance("asd", type) 
False 

하지만 개체에서 상속 된 클래스에만 적용됩니다.

+0

나는 이것이 OP가 찾고있는 것이 아니라고 확신한다. – mgilson

2

새로운 스타일의 클래스 (예 : object에서 명시 적으로 파생되거나 내재적으로 Python 3에서 파생 됨)의 형식은 classobj이 아닙니다. 구식 수업 만 classobj입니다. MyClasstype의 인스턴스 인 경우 모든 새로운 스타일의 클래스는 같이 쓸로 예를 클래스에 대한 그래서, 당신은 간단하게 확인할 수있는 모든 새로운 스타일의 클래스가 object에서 파생되기 때문에

isinstance(MyClass, type) 

당신은 또한 수

issubclass(MyClass, object) 

내가 무리를 줄 것이다 : 않는 클래스의 타입이없는 경우

type(MyClass) == type 

이 실패합니다하지만 메타 클래스. 물론 유스 케이스가있을 수 있습니다.

구식 클래스가 필요한지 확인하려면 types 모듈을 가져 와서 types.ClassType을 사용하거나 이전 스타일의 클래스를 선언하고 테스트 할 클래스가 있는지 확인하십시오 동일한 유형 :

class OldStyleClass: 
    pass 
OldStyleClass = type(OldStyleClass) 

isinstance(MyClass, OldStyleClass) 
22

사용 inspect : 때때로

import inspect 
print inspect.isclass(obj) 
+0

+1에 대한 검사 모듈 – pylover

+0

이제 +1을 생각하지 않은 이유는 무엇입니까? (+1) – mgilson

+0

나는 이것을 어떻게 잊어 버렸는지 모르지만 이것은 나의 것 (그리고 그와 동등한 것)보다 나은 대답입니다. – abarnert

-1

(개체를 인쇄하는 방법을 결정하려는 경우) 다음이 작동 :

def is_class(o): 
    return hasattr(o, '__dict__') 
+0

클래스를 포함한 대부분의 객체는이 속성을 가지고 있습니다 – pylover

+0

@pylover 실례합니다. 다른 질문 : "변수가 클래스 인스턴스인지 확인하는 방법"에 답변했습니다. 나는 너와 동의한다. 그러나 당신은 클래스가 아니고이 속성을 가진 객체의 예를 줄 수 있습니까? – sergzach

+0

아니요, 질문은'변수가 OBJECT **인지 확인하는 법 **입니다. INSTANCE가 아니라 – pylover