2017-06-05 51 views
0

在Python 3.6,比方说,我有一个抽象类MyAbstractClass如何写一个抽象的财产在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

你是否正在实施_only_ setter,没有getter? –

+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的命名空间,当你在基类中重写时,你只需要定义这个名字。

有一种解决办法。您可以创建单独的抽象方法,并把它们交给property直接:

class MyAbstractClass(ABC): 

    @abstractmethod 
    def getProperty(self): 
     pass 

    @abstractmethod 
    def setProperty(self, val): 
     pass 

    myAbstractProperty = property(getProperty, setProperty) 

提供了一个实现这个ABC现在需要gettersetter有一个执行(已在MyAbstractClass命名空间中被列为abstractmethod小号两个名字需要有一个实现):

class MyInstantiatableClass(MyAbstractClass): 

    def getProperty(self): 
     return self._Property 

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

实现他们是完全一样的任何旧的属性。那里没有区别。

+0

抽象属性不需要使用'.setter',并且在抽象属性中指定'.setter'不会强制具体实现具有setter或类似的东西。 – user2357112

+0

@ user2357112我并不期待这是真的。您显然可以强制实现通过将'abstractmethods'直接传递给'property'来定义。 –