type python3 classinfo and python subclass assert

python3 - python 3 isinstance vs type



¿Cómo puedo verificar(en tiempo de ejecución) si una clase es una subclase de otra? (7)

La función boolean issubclass(sub, sup) devuelve true si el sub subclase dado es de hecho una subclase de la superclase sup .

Digamos que tengo un Traje de clase y cuatro subclases de palo: 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 palo 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 asegure tal cosa? Algo como:

def my_method(suit): assert(suit subclass of Suit) ...

Estoy usando Python 3.


Puede usar isinstance si tiene una instancia, o issubclass si tiene una clase. Normalmente pensé que era una mala idea. Normalmente en Python se resuelve si un objeto es capaz de algo al intentar hacerle eso.


Puede usar issubclass() como este assert issubclass(suit, Suit) .

¿Pero por qué querrías hacer tal cosa? Python no es Java.


Puede usar el issubclass incorporado. Pero la verificación de tipos generalmente se considera innecesaria porque puede usar el método de pato.


Usar issubclass parecía una forma limpia de escribir niveles de registro. Es un poco extraño usarlo ... pero parece más limpio que otras opciones.

class Error(object): pass class Warn(Error): pass class Info(Warn): pass class Debug(Info): pass class Logger(): LEVEL = Info @staticmethod def log(text,level): if issubclass(Logger.LEVEL,level): print(text) @staticmethod def debug(text): Logger.log(text,Debug) @staticmethod def info(text): Logger.log(text,Info) @staticmethod def warn(text): Logger.log(text,Warn) @staticmethod def error(text): Logger.log(text,Error)



#issubclass(child,parent) class a: pass class b(a): pass class c(b): pass print(issubclass(c,b))#it returns true