7

そのようなコードを考えてみましょう:

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

class B(A):
   pass

クラスBは、クラスAのすべての属性を(継承)します。何らかの理由で、Bに属性'color'を継承させたくありません。これを行う可能性はありますか?
はい、私は知っています。最初に属性「name」と「description」を使用してクラスBを作成し、次に属性「color」を追加してBからクラスAを継承できます。しかし、私の正確なケースでは、Bは実際にはAの縮小バージョンであるため、(可能であれば)Bの属性を削除する方が論理的であるように思われます。

4

2 に答える 2

9

最善の解決策は、クラス階層を変更して、凝ったトリックなしで必要なクラスを取得できるようにすることだと思います。

ただし、これを行わない本当に正当な理由がある場合は、記述子を使用し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
于 2010-09-09T09:01:36.293 に答える
8

Bに別の値を指定することもできますがcolor、BにAのプロパティを持たせたくない場合は、新しい基本クラスを作成するという1つのクリーンな方法しかありません。

class Base():
    name = 7
    description = 8

class A(Base):
    color = 9

class B(Base):
    pass
于 2010-09-09T07:55:01.400 に答える