pythoninheritanceclass-attributes

Remove class attribute in inherited class Python


Consider such code:

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

class B(A):
   pass

Class B now has (inherits) all attributes of class A. For some reason I want B not to inherit attribute 'color'. Is there a possibility to do this?
Yes, I know, that I can first create class B with attributes 'name' and 'description' and then inherit class A from B adding attribute 'color'. But in my exact case, B is actually a reduced version of A, so for me it seems more logical to remove attribute in B (if possible).


Solution

  • I think the best solution would be to change your class hierarchy so you can get the classes you want without any fancy tricks.

    However, if you have a really good reason not to do this you could hide the color attribute using a Descriptor. You'll need to be using new style classes for this to work.

    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()
    

    You'll then get an AttributeError when you try to use the color attribute:

    >>> 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