【发布时间】:2017-05-05 23:02:17
【问题描述】:
一位高级开发人员希望我在 Python 中实现面向对象编程,其中我们使用 Base 类实例化所有对象创建。它不适合我,因为在派生类必须实现的基类中有抽象方法。他只使用 Base 类作为实例化对象的一种方式的理由是,当我们遍历对象列表时,我们可以以相同的方式访问它的变量和方法。由于基类的每个派生对象都具有比基类更多的实例化属性,因此他建议 init 函数将 *args 和 **kwargs 作为参数的一部分。
这是一个很好的方法吗?如果没有,你能帮忙推荐一个更好的选择吗?
这是一个简单的实现示例。
import abc
class Base(metaclass = abc.ABCMeta):
def __init__(self, reqarg1, reqarg2, **kwargs):
self.reqarg1 = reqarg1
self.reqarg2 = reqarg2
self.optarg1 = kwargs.get("argFromDerivedA", 0.123)
self.optarg2 = kwargs.get("argFromDerivedB", False)
self.dict = self.create_dict()
@abstractmethod
def create_dict(self):
pass
def get_subset_list(self, id):
return [item for item in self.dict.values() if item.id == id]
def __iter__(self):
for item in self.dict.values():
yield item
raise StopIteration()
class Derived_A(Base):
def __init__(self, regarg1, regarg2, optarg1):
super().__init__(regarg1, regarg2, optarg1)
def create_dict(self):
# some implementation
return dict
class Derived_B(Base):
def __init__(self, regarg1, regarg2, optarg2):
super().__init__(regarg1, regarg2, optarg2)
def create_dict(self):
# some implementation
return dict
编辑:为了清楚起见,我不太清楚如何正确处理基类中的抽象方法,因为高级开发人员希望按如下方式使用它:
def main():
b = Base(100, 200)
for i in get_subset_list(30):
print(i)
但是Base类中的dict没有定义,因为它是在派生类中定义的,因此会输出如下错误:
NameError: name 'abstractmethod' 未定义
【问题讨论】:
-
Python 不是强类型语言。 IE。您不必担心这类事情。
-
@IgnacioVazquez-Abrams:感谢您的建议;我会调查的
-
@AbdelhakimAkodadi:Python 不是强类型语言吗?你能扩展你的思维方式吗?
-
我认为这实际上是SoftwareEngineering 的更多问题,因为它是关于软件架构的(我可能错了)。
标签: python python-3.x oop derived-class base-class