Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/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_Class_Overriding - Fatal编程技术网

重写和扩展Python中父类中定义的方法

重写和扩展Python中父类中定义的方法,python,class,overriding,Python,Class,Overriding,我想在New.do(self,x)中重新定义方法Old.do(self),以便它采用一个参数,如下所示: #/usr/bin/env蟒蛇3 旧类(对象): 定义初始化(自): self.a=0 self.do() def do(自我): 打印(self.a) 新(旧)类: 定义初始化(自): 旧的。初始的(自我) b=1 self.do(b) def do(自我,b): 打印(自我a+b) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': new=new()

我想在
New.do(self,x)
中重新定义方法
Old.do(self)
,以便它采用一个参数,如下所示:

#/usr/bin/env蟒蛇3
旧类(对象):
定义初始化(自):
self.a=0
self.do()
def do(自我):
打印(self.a)
新(旧)类:
定义初始化(自):
旧的。初始的(自我)
b=1
self.do(b)
def do(自我,b):
打印(自我a+b)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
new=new()
我可以通过以下方式完成:

#/usr/bin/env蟒蛇3
旧类(对象):
定义初始化(自):
self.a=0
赛尔夫
def do(自我):
打印(self.a)
__do=do
新(旧)类:
定义初始化(自):
旧的。初始的(自我)
b=1
self.do(b)
def do(自我,b):
打印(自我a+b)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
new=new()
或者我可以通过对基类的显式引用来实现:

#/usr/bin/env蟒蛇3
旧类(对象):
定义初始化(自):
self.a=0
老。做(自己)
def do(自我):
打印(self.a)
新(旧)类:
定义初始化(自):
旧的。初始的(自我)
b=1
self.do(b)
def do(自我,b):
打印(自我a+b)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
new=new()
有没有其他方法可以得到同样的结果?你能做到吗


谢谢

你可以用super做你想做的事,比如:

class Old(object):
    def __init__(self):
        self.a = 1
        Old.do(self, self.a)

    def do(self, a):
        print(a)

class New(Old):
    def __init__(self):
      super(New, self).__init__()
      self.b = 2
      self.do(self.b)


    def do(self, b):
        print(self.a + b)



new = New()

第一次呼叫将返回1,第二次呼叫3

您可以使用super执行您尝试的操作,如下所示:

class Old(object):
    def __init__(self):
        self.a = 1
        Old.do(self, self.a)

    def do(self, a):
        print(a)

class New(Old):
    def __init__(self):
      super(New, self).__init__()
      self.b = 2
      self.do(self.b)


    def do(self, b):
        print(self.a + b)



new = New()

第一个调用将返回1,第二个调用将返回3

您应该问自己为什么要用这种方式覆盖
do()
,通常新的
do()
应该能够替换被覆盖的方法(契约设计),您应该问自己为什么要用这种方式覆盖
do()
,通常是新的
do()
应能够替换替代方法(按合同设计)