Disons que j'ai un costume de classe et quatre sous-classes de costume: Heart, Spade, Diamond, Club.
class Suit:
...
class Heart(Suit):
...
class Spade(Suit):
...
class Diamond(Suit):
...
class Club(Suit):
...
J'ai une méthode qui reçoit un costume comme paramètre, qui est un objet de classe, pas une instance. Plus précisément, il ne peut recevoir qu'une seule des quatre valeurs: Coeur, Bêche, Diamant, Club. Comment puis-je faire une affirmation qui assure une telle chose? Quelque chose comme:
def my_method(suit):
assert(suit subclass of Suit)
...
J'utilise Python 3.
my_method
peuvent être paramétrées: "il ne peut recevoir qu'une seule des quatre valeurs: Coeur, Bêche, Diamant, Club". Ces valeurs sont des objets de classe, pas des instances de classe. Cela me semble assez clair, bien que je suppose que vous avez raison sur le flou parce que les réponses couvrent les deux possibilités. Vous êtes plus que bienvenus pour modifier la question si vous avez un libellé plus clair pour cela. Merci pour le commentaire._class
, ce qui les rend similairessuit_class
. J'ai proposé une telle convention de dénomination dans une question pertinente .my_method(Heart)
my_method(Spade)
...inspect.isclass
ou simplement utiliserisinstance(myvar, type)
en Python 3, commeissubclass
cela soulèvera une erreur si elle est transmise à une non-classe. Voir cette réponse . J'aurais commenté la réponse ci-dessous, mais elle n'aurait jamais vu le jour.Réponses:
Vous pouvez utiliser
issubclass()
comme çaassert issubclass(suit, Suit)
.la source
issubclass(class, classinfo)
Extrait:
la source
Vous pouvez utiliser
isinstance
si vous avez une instance ouissubclass
si vous avez une classe. Normalement, je pensais que c'était une mauvaise idée. Normalement, en Python, vous déterminez si un objet est capable de quelque chose en essayant de lui faire cette chose.la source
La
issubclass(sub, sup)
fonction booléenne renvoie true si la soussub
- classe donnée est en effet une sous-classe de la superclassesup
.la source
issubclass
exemple exécutable minimalVoici un exemple plus complet avec quelques assertions:
GitHub en amont .
Testé en Python 3.5.2.
la source
Vous pouvez utiliser la sous-classe intégrée. Mais la vérification de type est généralement considérée comme inutile car vous pouvez utiliser la frappe de canard.
la source
Utiliser issubclass semblait être un moyen propre d'écrire des niveaux de journal. Cela semble un peu étrange de l'utiliser ... mais il semble plus propre que les autres options.
la source
Selon le document Python , nous pouvons également utiliser un
class.__mro__
attribut ou uneclass.mro()
méthode:la source
la source