2016-02-04 63 views
1

在Python中處理抽象屬性的最好的,最Pythonic的方法是什麼?如果我想實現一個混合了抽象屬性和具體方法的基類,我可以這樣做。在Python中實現抽象屬性

class BaseClass(object): 
    __metaclass__ = ABCMeta 

    @abstractmethod 
    def property1(self): 
     pass 

    @abstractmethod 
    def property2(self): 
     pass 

    @abstractmethod 
    def property3(self): 
     pass 

    @abstractmethod 
    def abstract_method(self): 
     pass 

    def concrete_method(self): 
     return self.property1 + self.property2 

然而,當我然後去實現繼承類,我需要實現每個屬性的getter方法的私有財產。

class Klass(BaseClass): 
    def __init__(property1, property2, property3): 
     self.__property1 = property1 
     self.__property2 = property2 
     self.__property3 = property3 

    @property 
    def property1(self): 
     return self.__property1 

    @property 
    def property2(self): 
     return self.__property2 

    @property 
    def property3(self): 
     return self.__property3 

這似乎既不必要冗長,也使代碼比它需要更晦澀。

如果繼承類沒有實現它自己的版本,我不喜歡具體實現東西並提高NotImplementedError的想法。

有沒有更好的方法來做到這一點?

回答

2

您不需要將屬性實現爲屬性。所有你需要的是名稱存在類別。所以下面,使用常規的屬性,將工作:

class Klass(BaseClass): 
    property1 = None 
    property2 = None 
    property3 = None 

    def __init__(property1, property2, property3): 
     self.property1 = property1 
     self.property2 = property2 
     self.property3 = property3 

    def abstract_method(self): 
     # implementation for the abstract method 

注意,有一個abstractproperty decorator是最好的文檔要使用這些名稱作爲簡單的值,而不是方法調用:

class BaseClass(object): 
    __metaclass__ = ABCMeta 

    @abstractproperty 
    def property1(self): 
     pass 

    @abstractproperty 
    def property2(self): 
     pass 

    @abstractproperty 
    def property3(self): 
     pass 

    @abstractmethod  
    def abstract_method(self): 
     pass 

    def concrete_method(self): 
     return self.property1 + self.property2 
+0

謝謝。我知道'abstractproperty'裝飾器已經存在,但是使用它卻沒有什麼意義。這是更可讀性。 –