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 在super()内调用父方法。当方法被子方法重写时_Python_Oop - Fatal编程技术网

Python 在super()内调用父方法。当方法被子方法重写时

Python 在super()内调用父方法。当方法被子方法重写时,python,oop,Python,Oop,我已重写子类中的方法。 此方法在父类构造函数中使用。 在子类中调用super() 例如: A类: 定义初始化(自): self.method() def方法(自我): 打印('父方法!') B(A)类: 定义初始化(自): super()。\uuuu init\uuuuu() def方法(自我): 打印('子方法!') b=b() 输出:子方法 而我想得到父方法 编辑: 我需要父类的类构造函数使用not OVERRIDE方法,但在此之后,父类对method()的每次调用都应该调用OVERRID

我已重写子类中的方法。 此方法在父类构造函数中使用。 在子类中调用
super()

例如:

A类:
定义初始化(自):
self.method()
def方法(自我):
打印('父方法!')
B(A)类:
定义初始化(自):
super()。\uuuu init\uuuuu()
def方法(自我):
打印('子方法!')
b=b()
输出:
子方法

而我想得到
父方法

编辑:


我需要父类的类构造函数使用not OVERRIDE方法,但在此之后,父类对
method()
的每次调用都应该调用OVERRIDE方法。

如果您遇到这种情况,我建议如下:

class B(A):
    def __init__(self):
        super().__init()
        self.n_method = 1
    def method(self):
        if self.n_method == 1:
            super().method()
        else:
            do method B stuffs
        self.n_method += 1

如果您遇到这种情况,我建议您:

class B(A):
    def __init__(self):
        super().__init()
        self.n_method = 1
    def method(self):
        if self.n_method == 1:
            super().method()
        else:
            do method B stuffs
        self.n_method += 1

因为我需要不使用重写的方法调用父构造函数,但每次都需要使用重写的方法

这表示您要求一种方法做的事情太多。将
方法
分为两部分:一部分不被
A.\uuu init\uuuu调用,另一部分可以被重写。差不多

class A:
    def __init__(self):
        self._init_method()

    def _init_method(self):
        print('parent method!')

    def method(self):
        self._init_method()


class B(A):
    def __init__(self):
        super().__init__()

    def method(self):
        print('child method!')

b = B()
\u init\u方法
执行您声称需要从
A执行的操作。同时,你可以让
method
做同样的事情,除非你重写它,在这种情况下,你可以做你想做的任何事情


因为我需要不使用重写的方法调用父构造函数,但每次都需要使用重写的方法

这表示您要求一种方法做的事情太多。将
方法
分为两部分:一部分不被
A.\uuu init\uuuu调用,另一部分可以被重写。差不多

class A:
    def __init__(self):
        self._init_method()

    def _init_method(self):
        print('parent method!')

    def method(self):
        self._init_method()


class B(A):
    def __init__(self):
        super().__init__()

    def method(self):
        print('child method!')

b = B()

\u init\u方法
执行您声称需要从
A执行的操作。同时,你可以让
method
做同样的事情,除非你重写它,在这种情况下你可以做你想做的任何事情
B.method

A
初始化方法中,你可以写
A.method(self)
而不是
self.method()
要更明确地说明调用哪个
方法

A
\uuuu init\uuuuuuuuo()
方法中,您可以编写
A.method(self)
而不是
self.method()
来更明确地说明调用哪个
方法。

AFAIK,当您在父对象和子对象中都有类似的方法时,子方法将获得子实例的优先级。为什么不重命名其中一个呢?因为我需要使用无重写方法调用父对象的构造函数,但每次都需要使用重写的构造函数。好的,当父对象和子对象中都有类似的方法时,子对象的实例将优先使用子对象的方法。为什么不重命名其中的一个呢?因为我需要使用无重写方法调用父级的构造函数,但每次都需要使用重写的方法。这解决了问题,但有点粗糙,不太面向对象。我将对此进行投票,但请检查chepner的答案。这是一个很好的解决方案,但我不确定您是否希望在每次创建父实例时调用父方法。这解决了问题,但有点粗糙,不太面向对象。我将对此进行投票,但请检查chepner的答案。这是一个很好的解决方案,但我不确定您是否希望在每次创建父实例时调用父方法。