2017-06-05 20 views
0

に抽象プロパティに書き込みする方法、のは、私は抽象クラスMyAbstractClassのPython 3.6でのPython 3.4+

from abc import ABC, abstractmethod 

class MyAbstractClass(ABC): 

    @property 
    @abstractmethod 
    def myProperty(self): 
     pass 

、それからクラスMyInstantiatableClass継承があるとしましょう。だから、このクラスのオブジェクトをインスタンス化するには、プロパティmyPropertyにどのように書き込むのですか?私は設定してmyPropertyを得ることができるようにしたいと思います。以下は動作しません。

from MyAbstractClass import MyAbstractClass 

class MyInstantiatableClass(MyAbstractClass): 
    def __init__(self, desiredValueOfMyProperty): 
     ???? 

    @myProperty.setter 
    def myProperty(self, desiredValueOfMyProperty): # value coming from __init__ 
     self._myProperty = desiredValueOfMyProperty 

そして主な機能、たとえば、

from MyInstantiatableClass import MyInstantiatableClass 

def main(): 
    MyInstantiatableClass(3) # 3 is the desiredValueOfMyProperty for this instantiation 
    MyInstantiatableClass(5) # 5 is the desiredValueOfMyProperty for this instantiation 
+2

getterを使用せずに_only_セッターを実装していますか? –

+0

私は 'MyInstantiatableClass'に' myProperty'をセットして取得できるようにしたいと思います。 – Bora

+0

通常と同じ方法でプロパティを定義します。 – user2357112

答えて

3

矛盾がここにありますようです。 @property@abstractmethodと一緒に使用しても、abcから継承したクラスは、settergetterの両方を定義する必要があります。

@property 
@abstractmethod 
def myProperty(self): 
    pass 

@myProperty.setter 
@abstractmethod 
def myProperty(self): 
    pass 

をして、唯一のクラスの作品にgetterのための実装を提供してインスタンス化することができます::この使用すると、

@property 
def myProperty(self): 
    return self._myProperty 

これが唯一の名前(myPropertyが)に表示されていることに起因しますABCの名前空間。基本クラスでオーバーライドするときには、この1つの名前を定義するだけです。

それを強制する方法があります。あなたは別の抽象メソッドを作成し、直接propertyにそれらを渡すことができます。今の両方gettersetterが実装(MyAbstractClass名前空間にabstractmethod sと記載されている両方の名前を持っている必要があり、このABCのための実装を提供

class MyAbstractClass(ABC): 

    @abstractmethod 
    def getProperty(self): 
     pass 

    @abstractmethod 
    def setProperty(self, val): 
     pass 

    myAbstractProperty = property(getProperty, setProperty) 

実装が必要):

class MyInstantiatableClass(MyAbstractClass): 

    def getProperty(self): 
     return self._Property 

    def setProperty(self, val): 
     self._Property = val 
    myAbstractProperty = property(getProperty, setProperty) 

これらの実装は、以前のプロパティとまったく同じです。そこに違いはありません。

+0

抽象プロパティは '.setter'を使う必要はなく、抽象プロパティで' .setter'を指定しても、具体的な実装にはセッターなどが必要になりません。 – user2357112

+0

@ user2357112私はそれを期待していませんでした、それは本当です。明示的に 'abstractmethods'を' property'に直接渡すことで両方を定義するように実装することができます。 –