web-dev-qa-db-fra.com

Comment vérifier si une variable est une classe ou non?

Je me demandais comment vérifier si une variable est une classe (pas une instance!) Ou non.

J'ai essayé d'utiliser la fonction isinstance(object, class_or_type_or_Tuple) pour le faire, mais je ne sais pas quel type aurait une classe.

Par exemple, dans le code suivant

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

J'ai essayé de remplacer "class" par ??? , mais je me suis rendu compte que class est un mot clé en python.

187
jeeyoungk

Encore mieux: utilisez la fonction inspect.isclass .

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

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

Inspect.isclass est probablement la meilleure solution, et il est vraiment facile de voir comment elle est réellement mise en œuvre

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))
37
andrea_crotti
>>> class X(object):
...     pass
... 
>>> type(X)
<type 'type'>
>>> isinstance(X,type)
True
30
S.Lott
isinstance(X, type)

Retourne True si X est class et False sinon.

19
qnub

la classe Foo: s'appelle l'ancienne classe de style et la classe X (objet): s'appelle la nouvelle classe de style. 

Vérifiez ceci Quelle est la différence entre l'ancien style et les nouvelles classes de style en Python? . Un nouveau style est recommandé. Lisez à propos de " unifiant les types et les classes "

1
JV.

le moyen le plus simple consiste à utiliser inspect.isclass tel que posté dans la réponse la plus votée.
les détails d’implémentation sont disponibles sur python2 inspect et python3 inspect .
pour la classe new-style: isinstance(object, type)
pour classe à l’ancienne: isinstance(object, types.ClassType)
em, pour la classe old-style, il utilise types.ClassType, voici le code de types.py :

class _C:
    def _m(self): pass
ClassType = type(_C)
0
lyu.l

Cette vérification est compatible avec Python 2.x et Python 3.x. 

import six
isinstance(obj, six.class_types)

Il s’agit d’une fonction de wrapper qui effectue le même contrôle que dans andrea_crotti answer.

Exemple:

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