Cómo escribir un argumento que será subclaseado en Python
Tengo un código que sigue este patrón:
from typing import Any
class Base:
...
class Derived1(Base):
...
class Derived2(Base):
...
class BasicApp:
# ¿Cómo debo tipar "d" en esta clase base?
def handle(self, d: Base) -> None:
print("handle from BasicApp", d)
class AppX(BasicApp):
def handle(self, d: Derived1) -> None:
print("handle from AppX", d)
class AppY(BasicApp):
def handle(self, d: Derived2) -> None:
print("handle from AppY", d)
No estoy seguro de cuál es la forma correcta de tipar “d” en BasicApp.d
.
Intenté d: Base
, luego obtuve el siguiente error:
error: El argumento 1 de "handle" no es compatible con el supertipo "BasicApp"; el supertipo define el tipo de argumento como "Base".
Intenté T = TypeVar('T', bound=Base)
y d: T
, luego obtuve el siguiente error:
error: El argumento 1 de "handle" no es compatible con el supertipo "BasicApp"; el supertipo define el tipo de argumento como "T".
¿Cuál es la manera correcta?
davy.ai
La forma correcta de escribir
d
enBasicApp
es utilizandoTypeVar
. Define unTypeVar
con una restricción aBase
, de la siguiente manera:Esto hace que
d
acepte cualquier tipo que sea una subclase deBase
. Cuando heredas deBasicApp
y sobrescribes el métodohandle
con un tipo más específico (por ejemplo,Derived1
oDerived2
), funciona correctamente porque esas clases son subclases deBase
.