プロパティx
を含むクラスから継承し、子クラスでこのプロパティを読み取り専用に設定したいとします。親クラスの__init__
が元のセッターを使用している場合、これは機能しません。次のコードを考えてみましょう。Python:プロパティのオーバーライド時に予期しない動作が発生する
class Parent:
def __init__(self, x=1):
# I want the following line to use the setter defined in the Parent
# class, even when __init__ is called from Child using super.
self.x = x
# Other initialization of Parent goes here.
@property
def x(self):
return self._x
@x.setter
def x(self, value):
"""Check that x is non-negative."""
if value < 0:
raise ValueError("x must be non-negative.")
self._x = value
class Child(Parent):
def __init__(self):
super().__init__() # Need this for initialization.
@property
def y(self):
return self._y
@y.setter
def y(self, value):
"""x can only be written to implicitly by setting y."""
self._y = value
self._x = abs(value)
@property
def x(self):
return self._x
@x.setter
def x(self, value):
raise AttributeError("Illegal access to x")
私は今Child
をインスタンス化しようとした場合のラインself.x = x
が呼ばれたとき、Child
のx
セッターはなくParent
のx
セッターと呼ばれているので、私はAttributeError: Illegal access to x
を取得します。 Pythonicの方法でParent
のセッターを使用するにはどうしたらいいですか?
self.x = ...
がParent
の方法で表示されたとき、それは常にParent
でx
セッターの使用をしなければならない、とself.x = ...
はChild
の方法で表示されたとき、それは常にChild
にx
セッターを利用する必要があり、明確にします、例外を発生させます。
このようなプロパティを継承することはできません。クラスの初期化後に 'Child.x = Parent.x.setter(Parent.x.fset)'を実行できます。 –
@AshwiniChaudharyそれは動作しません。これは 'x'を' Child'に対して読み取り専用にしません。 –