我正在将一些Java源代码翻译成Python。所以我有这个抽象的Java类,我将其翻译成:
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中的java.util.List)已经在父Java类中作为成员初始化。
public MyAbstractClass {
List<Object> sampleList = new ArrayList<Object>();
}
public ChidClass extends MyAbstractClass {
public ChildClass() {
sampleList.add("Element 1")
sampleList.add("Element 2")
}
}
父类缺少构造函数,所以如果我在Python中实现构造函数 init 来初始化列表,我必须在所有子类中编写super()。
我不知道自己应该这样做。我想也许做这样的事情会起作用:
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
如果这样可行,我会去尝试,但我想知道替代方案,这也是最好和最安全的方法。我正在寻找工程方式,所以如果有变化,我的代码中的后果将是最小的
由于
答案 0 :(得分:1)
执行此操作的正确方法是在__init__
函数中创建列表。
任何正确实现的子类都将调用其父类的构造函数,无论该构造函数是否存在(即它是默认的object
构造函数) ,因此您没有理由避免创建__init__
方法。
class MyAbstractClass(metaclass=ABCMeta):
def __init__(self):
self.sampleList = []
@property
@abstractmethod
def sampleProp(self):
return self.sampleProp