2016-07-11 2 views
3

私のコードクラスではAにプロパティがありますが、クラスBはそれを継承しません。 @propertyは継承をサポートしていますか?それとも私のせいですか?プロパティは継承をサポートしていますか?

class A(object): 

    def __init__(self): 
     self._x = 100 

    @property 
    def x(self): 
     return self._x 

    @x.setter 
    def x(self, v): 
     self._x = v 


class B(A): 

    @x.setter 
    def x(self, v): 
     self._x = v 

エラーメッセージは以下の通りです:

Traceback (most recent call last): 
    File "test.py", line 9, in <module> 
    class B(A): 
    File "test.py", line 10, in B 
    @x.setter 
NameError: name 'x' is not defined 
+2

'@Ax.setter'にする必要があります。 'x'はここで名前空間' A'の下にあります。 –

+0

プロパティを継承することはできますが、独立してプロパティを変更することはできません。 'x'を継承してセッターを追加すると、オリジナルもそれを持ちます。あなたは独立したバージョンを得るためにプロパティを 'x'として再度定義することができます。 –

+0

'x'は親機では読み取り専用ですが、子機では読み書きが可能ですか? @KlausD。 – jonrsharpe

答えて

2

それはちょうどからxを取得する場所を知りません。あなたは代わりにこれを行うことができます:xはグローバルスコープではないため、

class A(object): 
    def __init__(self): 
     self._x = 100 

    @property 
    def x(self): 
     return self._x 

class B(A): 
    @A.x.setter 
    def x(self, v): 
     self._x = v 
+1

* "セッターがないときA()。x = 1はプロパティ" * - 何? Python 2.xでこれを試していますか? setterがなければプロパティは読み込み専用なので、 'AttributeError:属性を設定できません'を返します。 – jonrsharpe

+0

@jonrsharpe、そうです。私はAを新しいスタイルのクラスに変更したので、今度はpython2とpython3と同じです –

3

NameErrorです。それはAのクラス名前空間内で定義されているので、明示的にA.xを使用してそこにアクセスする必要があります。これはかなり一般的な間違いです。 python subclass access to class variable of parent

プロパティを使用すると、少し複雑になる可能性があります。 Bに新しいセッターを追加すると、Dean's answerに示すようにA.x.setterを使用しても問題はありません。ただし、が既存のセッターを上書きする場合は、Aの動作も変更します。私はこれがあなたが望む行動だとは思わない。

代わりに、Aのゲッターと新しいセッターでサブクラスに新しいプロパティを作成する必要があります。私は新しい方法を飾るためにそれを使用していないとして、

class B(A): 

    x = property(A.x.__get__) # new property with same getter 

    @x.setter # new setter on new property 
    def x(self, v): 
     ... 

@構文砂糖なしpropertyの使用:私は、これは、最小限の繰り返しで、それを達成するために、この最も簡単な方法だと思います。 BのセッターからAのセッターにアクセスする場合は、super().x.__set__(whatever)で行うことができます。

関連する問題