Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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_Python 3.x_Inheritance_Methods_Subclass - Fatal编程技术网

在Python中通过类继承重新定义方法

在Python中通过类继承重新定义方法,python,python-3.x,inheritance,methods,subclass,Python,Python 3.x,Inheritance,Methods,Subclass,我在玩弄类继承,我想知道是否可以在不重写整个内容的情况下更改子类中继承方法的各个方面 例如: class Parent: def _init_(self, x): self.x = x def foo(self): a = self.x if a > 0: forward = True elif a < 0: forward = False

我在玩弄类继承,我想知道是否可以在不重写整个内容的情况下更改子类中继承方法的各个方面

例如:

class Parent:
    def _init_(self, x):
        self.x = x

    def foo(self):
        a = self.x
        if a > 0:
            forward = True
        elif a < 0:
            forward = False
        return forward

class Child1(Parent):
    def foo(self, y=None, bool=False):
        if bool:
            a = y
        else:
            a = self.x
        super().foo()

class Child2(Parent):
        pass

这是可能的,还是我只需要为每个类重写一个新方法?

我想我理解您的问题,并且我对如何解决这个问题有一些建议:

使用“私有”方法 例如:

class Parent:
    def _init_(self, x):
        self.x = x

    def foo(self):
        a = self.x
        if a > 0:
            forward = True
        elif a < 0:
            forward = False
        return forward

class Child1(Parent):
    def foo(self, y=None, bool=False):
        if bool:
            a = y
        else:
            a = self.x
        super().foo()

class Child2(Parent):
        pass
类父级:
定义初始化(self,x):
self.x=x
def_foo(self,a=None):
a=a,如果a为其他自我。x*2
如果a>10:
超过=真
其他:
超过=错误
返回
def foo(self):
返回自我。_foo()
一级儿童(家长):
def foo(self,y=None,condition=False):
如果条件:
a=y*2
其他:
a=self.x*2
返回自我。\u foo(a)
2类儿童(家长):
通过
在本例中,所有子类都将继承
\u foo
“private”函数,在该函数中,它们可能接收或不接收
a
的值

使用抽象类 对于这个问题,抽象类还有另一个解决方案(这里是一个如何实现的示例),您可以强制子类实现函数
foo

重要的 请记住,在抽象类的情况下,如果不定义用@abstractmethod修饰的函数,您将收到类似以下
TypeError的错误:无法用抽象方法foo实例化抽象类Child2

例如:

Python2.x

从abc导入ABCMeta,abstractmethod
类父级:
__元类_uu=ABCMeta
定义初始化(self,x):
self.x=x
def_foo(self,a=None):
a=a,如果a为其他自我。x*2
如果a>10:
超过=真
其他:
超过=错误
返回
@抽象方法
def foo(self):
通过
一级儿童(家长):
def foo(self,y=None,condition=False):
如果条件:
a=y*2
其他:
a=self.x*2
返回自我。\u foo(a)
2类儿童(家长):
def foo(self):
返回自我。_foo()
Python3.x

类父类(元类=ABCMeta):
定义初始化(self,x):
self.x=x
def_foo(self,a=None):
a=a,如果a为其他自我。x*2
如果a>10:
超过=真
其他:
超过=错误
返回
@抽象方法
def foo(self):
通过
一级儿童(家长):
def foo(self,y=None,condition=False):
如果条件:
a=y*2
其他:
a=self.x*2
返回自我。\u foo(a)
2类儿童(家长):
def foo(self):
返回自我。_foo()
在这两个示例中,运行以下命令将获得相同的结果:

print(Child1(2).foo(10,True))//True
print(Child1(2).foo())//False
print(Child2(2).foo())//False

可以,您需要将想要定制的部分提取到自己的方法中,这样每个子类都可以修改该部分。这太棒了@GustavoPedroni,谢谢!