【问题标题】:Initialize inherited class outside constructor in Python在Python中初始化构造函数之外的继承类
【发布时间】:2019-07-31 15:11:17
【问题描述】:

我有这样的事情:

from some_module import SomeClass


class BaseClass:
    ...


class AnotherClass(BaseClass, SomeClass):
    def __init__(self, parameter, **kwargs):
        BaseClass.__init__(**kwargs)
        self.parameter

    def some_abstract_method(self, **kwargs):
        # this is an abstract method declared in BaseClass
        # and the arguments **kwargs must be passed here 
        # to respect the interface
        SomeClass.__init__(self.parameter, **kwargs)
        SomeClass.do_something()
        return self

我这样做的原因是尊重BaseClass的接口。我想知道像这样构造对象AnotherClass 有多糟糕,以及是否有更好的方法来实现我想要做的事情。我能想到的唯一其他方法是做这样的事情:

class AnotherClass(BaseClass):
    def __init__(self, parameter, **kwargs):
        super().__init__(**kwargs)
        self.parameter

    def some_abstract_method(self, **kwargs):
        self.model = SomeClass(self.parameter, **kwargs)
        self.model.do_something()
        return self.model

但我不喜欢它,因为AnotherClass 本质上是与SomeClass 相同的对象。基本上,我想知道这里的最佳做法是什么。

【问题讨论】:

标签: python inheritance multiple-inheritance


【解决方案1】:

如果可以的话,我总是更喜欢组合而不是继承。原因是多方面的,但让我们试着列举几个:

  • 周围物体的状态较少。
  • 不违反单一关注范式。
  • 不会冒无意中发生名称冲突的风险。
  • 更容易测试。
  • 松耦合。

所以如果可以的话,我会采用你的第二个解决方案。

【讨论】:

  • 只是为了确定,使用 composition 是我编写课程的第二种方式吗?
猜你喜欢
  • 2018-01-30
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2014-04-05
  • 1970-01-01
  • 2013-12-13
  • 2017-04-17
相关资源
最近更新 更多