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