gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:16:06 27 4
gpt4 key购买 nike

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

我将尝试这是否有效,但我想知道替代方案以及哪种方法是最好、最安全的方法。我正在寻找工程方法,因此如果发生变化,我的代码中的后果将是最小的

谢谢

最佳答案

正确的方法是在 __init__ 函数中创建列表。

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

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

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

关于java - 具有方法访问检测的 Python 抽象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46175455/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com