변수가 클래스인지 아닌지 확인하는 방법?


236

변수가 클래스인지 아닌지 확인하는 방법이 궁금합니다 (인스턴스 아님!).

이 기능을 사용 isinstance(object, class_or_type_or_tuple)하여이 작업을 시도했지만 클래스에 어떤 유형이 있는지 알 수 없습니다.

예를 들어 다음 코드에서

class Foo: pass  
isinstance(Foo, **???**) # i want to make this return True.

" class"를 ???로 바꾸려고했습니다. 하지만 class파이썬에서 키워드 라는 것을 깨달았습니다 .

답변:


335

더 나은 : inspect.isclass기능을 사용하십시오 .

>>> import inspect
>>> class X(object):
...     pass
... 
>>> inspect.isclass(X)
True

>>> x = X()
>>> isinstance(x, X)
True
>>> y = 25
>>> isinstance(y, X)
False

7
당신은 또한 원하는 경우 inspect.isclass반환에 True검사 할 개체가있는 경우 클래스 인스턴스 사용inspect.isclass(type(Myclass()))
michaelmeyer

8
무엇보다 :)?
Mad Physicist

8
@michaelmeyer는 type(whatever)항상 클래스 인 객체를 반환 하므로이 검사는 중복됩니다. 그렇지 않은 경우 인스턴스화 whatever할 수있는 방법이 없으므로 처음부터 확인을 수행 할 수 없었습니다.
a_guest

나를 위해 작동하지 않습니다. snakemake와 함께 python3을 사용하면을 type(snakemake.utils)반환 <class 'module'>하고 아직 inspect.isclass(snakemake.utils)반환합니다 False.
tedtoal

3
snakemake.util모듈이 클래스가 아니기 때문 입니까?
Benjamin Peterson

44

inspect.isclass는 아마도 최고의 솔루션 일 것입니다. 실제로 어떻게 구현되는지 쉽게 알 수 있습니다.

def isclass(object):
    """Return true if the object is a class.

    Class objects provide these attributes:
        __doc__         documentation string
        __module__      name of module in which this class was defined"""
    return isinstance(object, (type, types.ClassType))

5
기억import types
nguyên

13
types.ClassType파이썬 3에서는 더 이상 필요하지 않으며 제거됩니다.
kawing-chiu

이것은 전혀 새로운 스타일의 클래스에서는 작동하지 않습니다. 심지어 파이썬 2
에서도이

그것은 inspect 모듈에서 가져온 것이므로 작동하지 않는 것 같습니다. 예를 들어 Python2.7로 간단하게 확인할 수 있습니다.In [8]: class NewStyle(object): ...: pass ...: In [9]: isinstance(NewStyle, (type, types.ClassType)) Out[9]: True
andrea_crotti

이것은 구식 및 신식 클래스를 처리 해야하는 Python 2 구현입니다. 파이썬 3는 이것을 단순화합니다 isinstance(object, type). 객체가 좋아하는 것으로 int, list, str, 등은 또한 당신이 구별이 사용할 수 있도록 클래스 사용자 정의 클래스 파이썬에서 정의내장 된 C 코드에 정의 된 클래스 .
Martijn Pieters

39
>>> class X(object):
...     pass
... 
>>> type(X)
<type 'type'>
>>> isinstance(X,type)
True

1
흠 ... 좋은 대답이지만 Foo 클래스에서 type (Foo)을 수행하면 <type 'type'> 대신 <type 'classobj'>이 (가) 표시됩니다. 나는 X가 객체에서 상속한다는 사실에서 차이가 있다고 가정하지만 Foo는 그렇지 않습니다. 이것으로 인해 다른 차이점이 있습니까? 감사.
jeeyoungk

6
그것은 이전 스타일의 클래스에 대한 작동하지 않습니다 'class Old:pass' 'isinstance(Old, type) == False',하지만 inspect.isclass(Old) == True.
jfs

1
@jeeyoungk : 당신은 "차이가 있다고 가정합니다 ..."가 아니라 실제로 코드에서 그것을 읽고 있습니다. 객체의 하위 클래스 ( "새 스타일")에는 원하는 속성이 있습니다.
S.Lott

12
힌트는 다음과 같습니다. 이것은 새로운 스타일의 클래스에서 작동하므로 구식 클래스를 사용하지 마십시오. 구식 클래스를 사용할 필요는 없습니다.
S.Lott

isinstance (e, f) E는 인스턴스화 된 객체이고 F는 클래스 객체입니다.
Dexter

24
isinstance(X, type)

클래스 True인지 아닌지 여부를 반환 합니다 .XFalse


3
X가 클래스 인 경우에도 False를받습니다.
Mads Skjern 2016 년

6
이것은 새로운 스타일 클래스에서만 작동합니다. 이전 스타일 클래스는 'classobj'유형입니다. 따라서 이전 스타일 클래스를 사용하는 경우 다음을 수행 할 수 있습니다. import types isinstance (X, types.ClassType)
Charles L.

2
이것은 S. Lott's answer4 년이 지난 것 같습니다.
Ethan Furman

5

이 검사는 Python 2.x 및 Python 3.x와 모두 호환됩니다.

import six
isinstance(obj, six.class_types)

이것은 기본적으로 andrea_crotti 답변에서와 동일한 검사를 수행하는 래퍼 함수입니다.

예:

>>> import datetime
>>> isinstance(datetime.date, six.class_types)
>>> True
>>> isinstance(datetime.date.min, six.class_types)
>>> False


1

가장 간단한 방법은 inspect.isclass가장 투표가 많은 답변에 게시 된대로 사용 하는 것입니다.
구현 세부 사항은 python2 inspectpython3 inspect 에서 찾을 수 있습니다 .
새 스타일 클래스의 경우 : isinstance(object, type)
이전 스타일 클래스의 경우 : isinstance(object, types.ClassType)
em, 이전 스타일 클래스의 경우을 사용 types.ClassType하고 있습니다. 여기 types.py 의 코드가 있습니다 .

class _C:
    def _m(self): pass
ClassType = type(_C)

1

벤자민 피터슨 (Benjamin Peterson) inspect.isclass()은이 직업 의 사용에 대해 옳 습니다. 그러나 내장 함수 issubclass를 사용하여 Class객체가 특정 Class적이고 따라서 암시 적으로 a 인지 테스트 할 수 있습니다 . 유스 케이스에 따라 더 파이썬 일 수 있습니다.Class

from typing import Type, Any
def isclass(cl: Type[Any]):
    try:
        return issubclass(cl, cl)
    except TypeError:
        return False

다음과 같이 사용할 수 있습니다 :

>>> class X():
...     pass
... 
>>> isclass(X)
True
>>> isclass(X())
False

-2

여기에 몇 가지 작동 솔루션이 있지만 여기 또 다른 솔루션이 있습니다.

>>> import types
>>> class Dummy: pass
>>> type(Dummy) is types.ClassType
True

types.ClassType파이썬 3에서 제거
보 바커
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.