Sobrescribir el tipo de dato de una pista de argumento en el método __init__
En este código:
class Obj():
def a(self):
pass
class ObjChild(Obj):
def b(self):
pass
class A:
def __init__(self, obj: Obj):
self.obj = obj
class B(A):
def __init__(self, obj: ObjChild):
super().__init__(obj)
def kuku(self):
self.obj.b()
Pycharm me advierte sobre la última línea que:
Referencia de atributo ‘b’ no resuelta para la clase ‘Obj’
Pero he especificado mediante una indicación de tipo que el objeto obj
que se pasa en el __init__
es de tipo ObjChild
, por lo que debería conocer estáticamente que self.obj
es una instancia de ObjChild
y debería tener el método b
.
¿Cómo puedo hacer que Pycharm se dé cuenta de eso? Está afectando la autocompletación en mi proyecto.
davy.ai
Para hacer que Pycharm se dé cuenta de que
self.obj
es una instancia deObjChild
y tiene el métodob
, puedes utilizar anotaciones de tipo. Específicamente, puedes utilizar anotaciones de tipo con declaracionesassert
para indicar queself.obj
es una instancia deObjChild
antes de llamar al métodob
. Así es como puedes modificar el métodokuku
:Este código asegura que
self.obj
sea una instancia deObjChild
antes de llamar al métodob
. Pycharm ahora reconocerá queself.obj
es una instancia deObjChild
y proporcionará autocompletado para el métodob
.