我正在翻譯一些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
我要去嘗試,如果這個工程,但我想知道的替代品,也這是這樣做的最佳和最安全的方式。我在尋找工程的方式,所以如果有新的變化,在我的代碼,後果將是最小的
感謝
正確的方法是在構造函數中創建列表。你爲什麼要避免使用構造函數?任何正確實現的子類都會調用它的父構造函數,所以它不像構造函數更加努力。 –
「父類缺少構造函數,...」如果你的意思是Java,這是不正確的。如果沒有實現構造函數,Java提供了一個默認構造函數,將所有屬性設置爲其默認值(對於基元,'0',對象爲'null')。請注意,這隻適用於在聲明時未初始化的屬性。至於'super()':至少在Java中,每個沒有通過'this(...)'或'super(...)'顯式調用另一個構造函數的類隱式地調用'super()'。 – Turing85
@Rawing如果不需要在每個子類中寫入super()調用,它看起來就像要走的路。我不確定這是否需要 – madtyn