tratando de hacer esto es probablemente una mala idea, pero ...
No parece ser hacer esto a través de la herencia "adecuada" debido a la forma en que mira hacia arriba B.x
funciona por defecto. Al obtener B.x
, el x
se busca por primera vez en B
y si no se encuentra allí se busca en A
, pero por otro lado al establecer o eliminar B.x
se buscará solamente B
.Así, por ejemplo
>>> class A:
>>> x = 5
>>> class B(A):
>>> pass
>>> B.x
5
>>> del B.x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: class B has no attribute 'x'
>>> B.x = 6
>>> B.x
6
>>> del B.x
>>> B.x
5
Aquí vemos que primero no parece ser capaz de eliminar B.x
ya que no existe (A.x
existe y es lo que se sirvió al evaluar B.x
). Sin embargo mediante el establecimiento de B.x
a 6 el B.x
existirá, puede ser recuperada por B.x
y eliminados por del B.x
por el que deja de existir así que después de que de nuevo A.x
se servirá como respuesta a B.x
.
Lo que podría hacer en el otro lado es el uso de metaclases hacer B.x
aumento AttributeError
:
class NoX(type):
@property
def x(self):
raise AttributeError("We don't like X")
class A(object):
x = [42]
class B(A, metaclass=NoX):
pass
print(A.x)
print(B.x)
ahora de los puristas del curso puede gritar que esto rompe el LSP, pero no es tan simple. Todo se reduce a si considera que ha creado un subtipo al hacer esto. Los métodos issubclass
y isinstance
dicen que sí, pero LSP dice que no (y muchos programadores suponen que "sí" ya que hereda de A
).
El LSP significa que si B
es un subtipo de A
entonces podríamos utilizar B
siempre podríamos utilizar A
, pero ya que no podemos hacer esto mientras se hace este constructo podríamos concluir que B
en realidad no es un subtipo de A
y, por lo tanto, LSP no se infringe.
Esto rompe [LSP] (http://en.wikipedia.org/wiki/Liskov_substitution_principle). ¿Por qué quieres hacer esto? –
La variable de clase 'x' de' B' que desea eliminar está realmente almacenada en 'A .__ dict__', por lo que si logra eliminarla, también eliminará' A.x'. Por lo tanto, lo más cerca que puede venir es _hiding_ 'A.x' al darle' B' una variable de clase 'x' también, como @Keith sugiere en su respuesta. –
@JBernardo: No hay mucha conexión entre LSP y el tipado estático. LSP es un principio sólido porque hace que las jerarquías de clase se comporten de una manera predecible y coherente. Esto se aplica igualmente a los lenguajes tipados de forma estática o dinámica, independientemente de si proporcionan los medios para violar el LSP. –