如何选择覆盖构造函数中超类方法的方法?

时间:2017-11-06 21:06:38

标签: python oop

我喜欢覆盖超类的一种方法,并为目标方法提供不同的选项。例如,超类中的函数称为__func__,我有两个实现__func1__func2的实现__func__。我想根据用户的输入从构造函数中选择这两个函数中的一个。我尝试了一些我能想到的东西,但没有一个能奏效。这是可能吗?如果是,那么正确的做法是什么?

编辑:我的班级使用__slots__来定义成员变量,所以我不能使用像self.__func__ = self.__func1这样的东西

3 个答案:

答案 0 :(得分:2)

是的,这是可能的。这是子类中的代码示例。父类中无需更改:

 def __init__(self, user_input):
    if (condition 1):
       self.__func__ = self.func1
    else:
       self.__func__ = self.func2

 def __func1(self, your arguments):
    code

 def __func2(self, your arguments)
    other code

由于我不知道函数或条件的论据,这是我能得到的具体细节。

答案 1 :(得分:1)

我认为您需要将SharedData的用户输入存储到实例属性中:

__init__

编辑:这是一个不存储用户输入的简单变体。或许有其他更复杂的方法可以做到这一点。但这是最简单的一个:

class Parent(object):

    def func(self):
        raise NotImplementedError


class Child(Parent):

    def __init__(self, user_input):
        self.user_input = user_input

    def func(self):
        if self.user_input == "func1":
            self._func1()
        elif self.user_input == "func2":
            self._func2()
        else:
            # make sure to guard against other possible inputs!

    def _func1(self):
        # implementation here

    def _func2(self):
        # implementation here

答案 2 :(得分:1)

class Subclass(Superclass):
    def __init__(self, choice=True, *args, **kwargs)
        super().__init__(*args, **kwargs)
        self.choice=choice

    def __func__(self):
        if self.choice:
            return self.__func1()
        else:
            return self.__func2()

   def __func1(self):
       do something

   def __func2(self):
       do something