Python界面和自我实现

时间:2017-10-02 00:05:31

标签: python inheritance design-patterns interface

对于简单的策略设计模式,我有一个更具设计性的问题。

假设我有一个界面:

class RenewInterface:
    def __init__(*args, **kwargs):
        self.var1 = {}
        self.var2 = []
        if args:
            for i in args:
                inst = i()
                self.var1[inst.__class__.__name__] = inst

    @abstractmethod
    def renew(*args, **kwargs)
        Do some stuff and call renew in self.var1[inst__class__.__name__]

class ChildClass(RenewInterface):
    def __init__(*args, **kwargs):
        super(ChildClass, self).__init__(*args, **kwargs)

    def renew(self, *args, **kwargs)
        Do more stuff

当我继承该类时,如果我选择调用超类__init__(上面的代码)。如果我没有args那么我只会将var1var2暴露给子类,但如果我出于某种原因有args并且我用super(ChildClass, self).__init__(*args, **kwargs)调用了父(RenewInterface)并且arg由于某种原因是ChildClass的类,那么我想我会从它自己实例化ChildClass?由于我不关心超类中的变量可以:

  1. 跳过调用超类
  2. 在ChildClass中一起跳过__init__所有?,然后再次使用RenewInterface __init__进行实例化
  3. 我已经尝试了所有这一切都有效,但我不确定最“pythonic”的做法是什么?或者更重要的是,这与版本2.6,2.7和python> = 3.3不同。

    我已阅读文档并试图谷歌,但我没有找到任何确凿的信息:(

    此致

1 个答案:

答案 0 :(得分:0)

如果我错了,请纠正我。

您似乎想知道处理方法重载的最pythonic方法,特别是 init 方法来解决您的问题。

选项包括:  1.超载方法,但不要打电话给超级班级'方法  2.不要使方法过载。离开超级班#39;要调用的方法。

这不是一个' pythonic'问题,它与OO有关。 基类方法提供默认实现。如果您不想要默认实现,则覆盖该方法。根据我的意见,您对子类的默认实现不满意。覆盖它。