2017-09-12 24 views
0

我正在翻譯一些Java源代碼到Python。所以我有這個抽象的Java類,這是我翻譯的:Python抽象屬性與方法訪問檢測

from abc import ABCMeta, abstractmethod 

class MyAbstractClass(metaclass=ABCMeta): 
    @property 
    @abstractmethod 
    def sampleProp(self): 
     return self.sampleProp 

    # this one is the important 
    @property 
    @abstractmethod 
    def sampleList(self): 
     return self.sampleList 

我的疑問是,在Java中所有子類的子類的元素添加到列表中,因爲列表(java.util.List中使用Java )已經作爲成員在父Java類中初始化。

public MyAbstractClass { 
    List<Object> sampleList = new ArrayList<Object>(); 
} 

public ChidClass extends MyAbstractClass { 
    public ChildClass() { 
     sampleList.add("Element 1") 
     sampleList.add("Element 2") 
    } 
} 

父類是缺乏一個構造函數,所以如果我實現構造初始化在Python初始化列表中,我不得不寫可能超()在所有子類。

我不知道我是否應該那樣做。我想,也許做一些像這樣的工作:

class MyAbstractClass(metaclass=ABCMeta): 
    @property 
    @abstractmethod 
    def sampleList(self): 
     if not self.sampleList: 
     # Alternative way 
     #if not hasattr(self, 'sampleList'): 
      self.sampleList = [] 
     return self.sampleList 

我要去嘗試,如果這個工程,但我想知道的替代品,也這是這樣做的最佳和最安全的方式。我在尋找工程的方式,所以如果有新的變化,在我的代碼,後果將是最小的

感謝

+1

正確的方法是在構造函數中創建列表。你爲什麼要避免使用構造函數?任何正確實現的子類都會調用它的父構造函數,所以它不像構造函數更加努力。 –

+1

「父類缺少構造函數,...」如果你的意思是Java,這是不正確的。如果沒有實現構造函數,Java提供了一個默認構造函數,將所有屬性設置爲其默認值(對於基元,'0',對象爲'null')。請注意,這隻適用於在聲明時未初始化的屬性。至於'super()':至少在Java中,每個沒有通過'this(...)'或'super(...)'顯式調用另一個構造函數的類隱式地調用'super()'。 – Turing85

+0

@Rawing如果不需要在每個子類中寫入super()調用,它看起來就像要走的路。我不確定這是否需要 – madtyn

回答

1

做到這一點,正確的方法是創建在__init__功能列表。

任何正確實現子類會調用它的父類的構造函數,不管是否存在構造函數或沒有(即它的默認構造函數object),所以你沒有理由避免創建__init__方法。

class MyAbstractClass(metaclass=ABCMeta): 
    def __init__(self): 
     self.sampleList = [] 

    @property 
    @abstractmethod 
    def sampleProp(self): 
     return self.sampleProp 
+0

我現在很好奇,如果另一種方式可行,即使知道這是一個更糟糕的選擇。也許它會在另一個環境中有用 – madtyn