views:

54

answers:

2

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

+4  A: 

You can supply a different value for color in B, but if you want B not to have some property of A then there's only one clean way to do it: create a new base class.

class Base():
    name = 7
    description = 8

class A(Base):
    color = 9

class B(Base):
    pass
Duncan
+1  A: 

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

    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 attrbute
>>> instance = B()
>>> instance.color
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in __get__
AttributeError: Hidden attrbute
>>> instance.color = 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in __set__
AttributeError: Hidden attribute
Dave Webb
You are right, I should change my class hierarchy.
Graf
@Graf - Changing the class hierarchy was in @Duncan's answer first - I just linked to it - so I think you should accept his answer really.
Dave Webb