El mié, 6 ene 2021 a las 17:02, Miguel Sanchez (<msanc...@uninet.edu>) escribió:
> Hola buenas (y felices Reyes): > > > Tengo una classe con un montón de atributos y métodos. > > Esta clase es la clase "base" de otras. > > Las clases derivadas no necesitan algunos de los métodos o atributos de la > clase base. > > El tema de los métodos lo he solucionado con mixin pues sólo son 4 métodos > los afectados. > > El tema de los atributos no lo tengo tan claro. He visto varias soluciones > (especialmente en SO), pero me he decido por una propia. > > He definido una propiedad sin métodos para los atributos que quiero > "anular" en la clase derivada. > > La cosa queda más o menos así: > > > class Base(): > > def __init__(self, **kwargs): > self.a = {} > ... > > > class A(Base): > > def __init__(self, **kwargs): > super().__init__(**kwrgs) > ... > > a = property() > > > Esto consigue (aparentemente) el efecto que busco y cuando se intenta usar > el atributo "a" en una instancia de la clase "A" obtengo un error del tipo > AttributeError unreadable attribute, lo que me vale. > > Entiendo que una instancia de "A" sigue teniendo realmente el atributo "a" > aunque no lo pueda leer ni modificar. > > La pregunta es: ¿Esta forma de hacer las cosas me puede dar algún problema > en el futuro (algo distinto de lanzar una exception AttributeError claro)? > ¿Hay formas más pythónicas de hacer esto? > > Lo pythónico sería no tener problemas con que sean visibles los atributos y métodos de la clase padre (*Python es un lenguaje explícito*). Los atributos que se inicializan en la clase padre te los puedes cagar sin más en la hija: class A(Base): def __init__(self, **kwargs): super().__init__(**kwargs) del self.a Otra cosa son los métodos, en realidad objetos del tipo *descriptor* pertenecientes a la clase padre. No son parte de la instancia, por lo que no puedes eliminarlos de esta ni de la subclase, únicamente puede conseguir que produzca una excepción. Se puede hacer de varios modos, pero la más sencilla es crear un método que produzca la excepción: class Base: def method(self): ... class A(Base): def method(self): raise NotImplementedError Pensando en los motivos por los que no quieres ver atributos/métodos, sospecho que puede ser porque trabajas con un IDE que te muestra demasiadas opciones al autocompletar los atributos. Hoy en día hay algunas herramientas que aplican AI a la selección de atributos, capaces de priorizar las que cree que son más relevantes a tu modo de programar. Por ejemplo: Kite <https://www.kite.com/> Saludos. -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": https://blog.ch3m4.org Buscador Python Hispano: http://busca.ch3m4.org <https://blog.ch3m4.org/pages/busqueda-python-es/>
_______________________________________________ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es