Digamos que tengo un traje de clase y cuatro subclases de traje: Corazón, Espada, Diamante, Club.
class Suit:
...
class Heart(Suit):
...
class Spade(Suit):
...
class Diamond(Suit):
...
class Club(Suit):
...
Tengo un método que recibe un traje como parámetro, que es un objeto de clase, no una instancia. Más precisamente, puede recibir solo uno de los cuatro valores: Corazón, Espada, Diamante, Club. ¿Cómo puedo hacer una afirmación que garantice tal cosa? Algo como:
def my_method(suit):
assert(suit subclass of Suit)
...
Estoy usando Python 3.
my_method
pueden obtener como parámetros: "puede recibir solo uno de los cuatro valores: Corazón, Espada, Diamante, Club". Esos valores son objetos de clase, no instancias de clase. Me parece bastante claro, aunque supongo que tienes razón acerca de la vaguedad porque las respuestas cubren ambas posibilidades. Eres más que bienvenido a editar la pregunta si tienes un lenguaje más claro para ello. Gracias por el comentario._class
, haciéndolos gustarsuit_class
. Me propuse dicha convención una denominación en una cuestión relevante .my_method(Heart)
my_method(Spade)
...inspect.isclass
o simplemente usarlaisinstance(myvar, type)
en Python 3, ya queissubclass
generará un error si se pasa una no clase. Mira esta respuesta . Hubiera comentado la respuesta a continuación, pero nunca habría visto la luz del día.Respuestas:
Puedes usar
issubclass()
asíassert issubclass(suit, Suit)
.fuente
issubclass(class, classinfo)
Extracto:
fuente
Puede usar
isinstance
si tiene una instancia, oissubclass
si tiene una clase. Normalmente pensé que era una mala idea. Normalmente, en Python se determina si un objeto es capaz de hacer algo al intentar hacerle eso.fuente
La
issubclass(sub, sup)
función booleana devuelve verdadero si la subclase dadasub
es de hecho una subclase de la superclasesup
.fuente
issubclass
ejemplo ejecutable mínimoAquí hay un ejemplo más completo con algunas afirmaciones:
GitHub aguas arriba .
Probado en Python 3.5.2.
fuente
Puede usar la subclase incorporada. Pero la verificación de tipos generalmente se considera innecesaria porque puede usar la escritura de pato.
fuente
Usar issubclass parecía una forma limpia de escribir loglevels. Se siente un poco extraño usarlo ... pero parece más limpio que otras opciones.
fuente
Según el documento de Python , también podemos usar el
class.__mro__
atributo o elclass.mro()
método:fuente
fuente