web-dev-qa-db-fra.com

Python vérifie les instances de classes

Est-il possible de vérifier si l'objet est une instance d'une classe? Pas une instance d'une classe concrète, mais une instance d'une classe.

Je peux vérifier qu'un objet n'est pas une classe, pas un module, pas une traceback, etc.

51
exbluesbreaker

isinstance() est votre ami ici. Il retourne un booléen et peut être utilisé des manières suivantes pour vérifier les types.

if isinstance(obj, (int, long, float, complex)):
    print obj, "is a built-in number type"

if isinstance(obj, MyClass):
    print obj, "is of type MyClass"

J'espère que cela t'aides.

65
Matt Alcock

Avez-vous essayé isinstance() fonction intégrée?

Vous pouvez également consulter hasattr(obj, '__class__') pour voir si l'objet a été instancié à partir d'un type de classe.

16
Ber

Je suis en retard. de toute façon pense que cela devrait marcher.

is_class = hasattr(obj, '__name__')
5
ellethee
class test(object): pass
type(test)

résultats

<type 'type'>

instance = test()
type(instance)

résultats

<class '__main__.test'>

C'est donc une façon de les différencier. 

def is_instance(obj):
    import inspect, types
    if not hasattr(obj, '__dict__'):
        return False
    if inspect.isroutine(obj): 
        return False
    if type(obj) == types.TypeType: # alternatively inspect.isclass(obj)
        # class type
        return False
    else:
        return True
4
user2682863

Voici un tour de la terre.

if str(type(this_object)) == "<type 'instance'>":
    print "yes it is"
else:
    print "no it isn't"
1
f.rodrigues

Je pense que je suis assez en retard sur celui-ci et enfait luttait avec le même problème Alors voici ce qui a fonctionné pour moi.

>>> class A:
...     pass
... 
>>> obj = A()
>>> hasattr(obj, '__dict__')
True
>>> hasattr((1,2), '__dict__')
False
>>> hasattr(['a', 'b', 1], '__dict__')
False
>>> hasattr({'a':1, 'b':2}, '__dict__')
False
>>> hasattr({'a', 'b'}, '__dict__')
False
>>> hasattr(2, '__dict__')
False
>>> hasattr('hello', '__dict__')
False
>>> hasattr(2.5, '__dict__')
False
>>> 

J'ai testé cela sur Python 3 et 2.7.

1
Rohit

C'est un peu difficile de dire ce que vous voulez, mais peut-être que inspect.isclass(val) est ce que vous cherchez?

1
Ned Batchelder

J'ai eu un problème similaire à ce qui s'est avéré fonctionner pour moi:

def isclass(obj):
    return isinstance(obj, type)
1
N.C. van Gilse

ou 

import inspect
inspect.isclass(myclass)
1
Farsheed

Oui. En conséquence, vous pouvez utiliser hasattr(obj, '__dict__') ou obj is not callable(obj).

0
seaky

A dû faire face à quelque chose de similaire récemment.

import inspect

class A:
    pass

def func():
    pass

instance_a = A()

def is_object(obj):
     return inspect.isclass(type(obj)) and not type(obj) == type

is_object(A)          # False
is_object(func)       # False
is_object(instance_a) # True
0
Ben Hoff