2010-09-09 37 views
5

considerar tal código:elimina el atributo de clase en Python clase heredada

class A(): 
    name = 7 
    description = 8 
    color = 9 

class B(A): 
    pass 

Clase B tiene ahora (hereda) todos los atributos de la clase A. Por alguna razón quiero B no heredar atributo 'color'. ¿Hay una posibilidad de hacer esto?
Sí, lo sé, primero puedo crear la clase B con los atributos 'nombre' y 'descripción' y luego heredar la clase A desde B agregando el atributo 'color'. Pero en mi caso exacto, B es en realidad una versión reducida de de A, así que para mí parece más lógico eliminar el atributo en B (si es posible).

+3

Si B es una versión reducida de A, ¿por qué no un extienden B en lugar de a la inversa ¿redondo? –

Respuesta

8

Creo que la mejor solución sería change your class hierarchy para que pueda obtener las clases que desee sin ningún tipo de trucos de fantasía.

Sin embargo, si tiene una buena razón para no hacerlo, podría ocultar el atributo colorusing a Descriptor. Deberá usar nuevas clases de estilo para que esto funcione.

class A(object): 
    name = 7 
    description = 8 
    color = 9 

class Hider(object): 
    def __get__(self,instance,owner): 
     raise AttributeError, "Hidden attribute" 

    def __set__(self, obj, val): 
     raise AttributeError, "Hidden attribute" 

class B(A): 
    color = Hider() 

A continuación, obtener una AttributeError cuando intenta utilizar el atributo color:

>>> B.color 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 3, in __get__ 
AttributeError: Hidden attribute 
>>> instance = B() 
>>> instance.color 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 3, in __get__ 
AttributeError: Hidden attribute 
>>> instance.color = 3 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 6, in __set__ 
AttributeError: Hidden attribute 
+0

Tienes razón, debería cambiar mi jerarquía de clases. – Graf

+0

@Graf - Cambiar la jerarquía de clases estaba primero en la respuesta de @Duncan, acabo de vincularlo, así que creo que deberías aceptar su respuesta realmente. –

7

Puede suministrar un valor diferente para color en B, pero si desea que B no tenga alguna propiedad de A, solo tiene una forma limpia de hacerlo: crear una nueva clase base.

class Base(): 
    name = 7 
    description = 8 

class A(Base): 
    color = 9 

class B(Base): 
    pass 
Cuestiones relacionadas