Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 调用重写的超级方法两次以确保状态/结果有效?_Python_Oop - Fatal编程技术网

Python 调用重写的超级方法两次以确保状态/结果有效?

Python 调用重写的超级方法两次以确保状态/结果有效?,python,oop,Python,Oop,我有两个类,一个是从父类继承的子类 Parent类有一个名为getIt的方法,它使用属性param来计算一些值并返回它。该值可以是None。当Child类继承Parent时,它会覆盖getIt,这样如果getIt的返回值是None,它会将param更改为一定会返回除None以外的值。因此,我们的目标是永远不要让Child类的实例调用getIt返回None。我是这样做的 class Parent(object): def __init__(self, some_params):

我有两个类,一个是从父类继承的子类
Parent
类有一个名为
getIt
的方法,它使用属性
param
来计算一些值并返回它。该值可以是
None
。当
Child
类继承
Parent
时,它会覆盖
getIt
,这样如果
getIt
的返回值是
None
,它会将
param
更改为一定会返回除
None
以外的值。因此,我们的目标是永远不要让
Child
类的实例调用
getIt
返回
None
。我是这样做的

class Parent(object):
    def __init__(self, some_params):
        self.param = some_value
    def getIt(self):
        val = # use self.param to do some logic   
        if val == []:
            raise RuntimeError("message")   

class Child(Parent):
    def __init__(self, some_params):
        super(Child, self).__init__(some_params)
    def getIt(self):
        try:
            val = super(Child, self).getIt()
        except RuntimeError:
            self.param = some_other_value     # setting self.param to some_other_value will surely make getIt return a non empty list`
            val = super(Child, self).getIt()
        return val

有什么更好的方法吗?

@downvoter:这似乎是一个合法的问题。为什么投反对票?我是投反对票的人。你这样抽象地描述了这件事,我不知道你所做的是否明智。
self.param
代表什么,为什么在调用getter时将其值(以及对象的状态)更改为任意值是合理的?如果目标只是不让
Child.getIt
返回
None
,那么如果
super>只返回默认值就更正常了(父母,自己).getIt
返回
None
,而不是修改对象的状态并再次调用
Parent.getIt
。但是如果没有更具体的解释,我不知道这是否是一个有用的注释。我同意@MarkAmery的观点-即使进行了编辑,似乎-嗯,很奇怪。如果你能描述限制应该放在父类中,子类应该只扩展功能。