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

Responder a