具有方法访问检测的Python抽象属性

时间:2017-09-12 11:40:03

标签: java python python-3.x inheritance

我正在将一些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

如果这样可行,我会去尝试,但我想知道替代方案,这也是最好和最安全的方法。我正在寻找工程方式,所以如果有变化,我的代码中的后果将是最小的

由于

1 个答案:

答案 0 :(得分:1)

执行此操作的正确方法是在__init__函数中创建列表。

任何正确实现的子类都将调用其父类的构造函数,无论该构造函数是否存在(即它是默认的object构造函数) ,因此您没有理由避免创建__init__方法。

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

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