Удалить атрибут класса в унаследованном классе Python - PullRequest
5 голосов
/ 09 сентября 2010

Рассмотрим такой код:

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

class B(A):
   pass

Класс B теперь имеет (наследует) все атрибуты класса A. По какой-то причине я хочу, чтобы B не наследовал атрибут 'color'.Есть ли возможность сделать это?
Да, я знаю, что я могу сначала создать класс B с атрибутами 'name' и 'description', а затем наследовать класс A от B, добавив атрибут 'color'.Но в моем конкретном случае B на самом деле является уменьшенной версией A, поэтому для меня кажется более логичным удалить атрибут в B (если это возможно).

Ответы [ 2 ]

8 голосов
/ 09 сентября 2010

Я думаю, что лучшим решением было бы изменить иерархию классов , чтобы вы могли получить нужные классы без каких-либо хитростей.

Однако, если у вас есть действительно веская причина не делать этого, вы можете скрыть атрибут color с помощью дескриптора. Для этого вам понадобятся новые классы стилей.

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

После этого вы получите AttributeError при попытке использовать атрибут 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
7 голосов
/ 09 сентября 2010

Вы можете указать другое значение для color в B, но если вы хотите, чтобы B не обладал каким-либо свойством A, то есть только один чистый способ сделать это: создать новый базовый класс.

class Base():
    name = 7
    description = 8

class A(Base):
    color = 9

class B(Base):
    pass
...