es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para hacer que Pycharm se dé cuenta de que self.obj es una instancia de ObjChild y tiene el método b, puedes utilizar anotaciones de tipo. Específicamente, puedes utilizar anotaciones de tipo con declaraciones assert para indicar que self.obj es una instancia de ObjChild antes de llamar al método b. Así es como puedes modificar el método kuku:

    def kuku(self):
        assert isinstance(self.obj, ObjChild)
        self.obj.b()
    

    Este código asegura que self.obj sea una instancia de ObjChild antes de llamar al método b. Pycharm ahora reconocerá que self.obj es una instancia de ObjChild y proporcionará autocompletado para el método b.

Comments are closed.