Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.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 - Fatal编程技术网

如何在Python中调用超类中的子类方法

如何在Python中调用超类中的子类方法,python,Python,我想知道如何在超类中调用子类方法。这是一个非常广泛的问题。由于您没有提供示例代码,我将只显示最简单的示例: class A(object): def meth1(self, a): self.meth2(a, a*a) class B(A): def meth2(self, a, b): return b / a b = B() b.meth1(10) 子类背后的要点是它扩展并改变了超类的行为。超类不知道子类将如何扩展它 编辑:但超类很可能知道子类将

我想知道如何在超类中调用子类方法。

这是一个非常广泛的问题。由于您没有提供示例代码,我将只显示最简单的示例:

class A(object):
   def meth1(self, a):
       self.meth2(a, a*a)

class B(A):
   def meth2(self, a, b):
       return b / a

b = B()
b.meth1(10)

子类背后的要点是它扩展并改变了超类的行为。超类不知道子类将如何扩展它


编辑:但超类很可能知道子类将扩展它。不确定这是否是一个好的设计。

以下是我刚刚尝试过的:

class A(object):
    def x(self): 
        print self.y()

class B(A):
    def y(self): 
        return 1

>>> B().x()
1

因此,除非您遇到一些特定的问题,否则只需从基类中的子类调用一个方法,它就可以正常工作。

我认为这与使用抽象方法有关。父类定义子类应该实现的方法,父类知道这些方法将被实现。类似的结构存在于Java中


这里很好地讨论了在Python中使用这些模式:

我相信这是一种经常使用的模式

class A(object):
    def x(self):
        self.y()

    def y(self):
        print('default behavior')


class B(A):
    def y(self):
        print('Child B behavior')

class C(A):
    def z(self):
        pass

>>>B().x()
Child B behavior
>>>C().x()
default behavior

它有点像一个抽象类,但提供了默认行为。但是,我记不起头顶上图案的名称。

a来自哪里?方法在哪里?@Tichodroma对不起,是我的错。应该边写边思考;-)现在更正。如果这些类在单独的模块中怎么办?i、 e.file2.py导入file1类TestCase(file1.TestBase):def execute(self):self.pass()file1.py类TestBase:def pass(self):打印“pass”TestBase=TestBase()TestBase.execute()@ThePracticalOne难以读取,但在您的情况下,根本不使用
file2.py
。如果您执行
testcase=testcase()
testcase.execute()
,它应该可以工作。我想知道为什么有人想这样做。为什么我要以我事先知道的方式编写
A
B
将如何扩展它?@Tichodroma:是的,这里有一些代码的味道。但可能是因为,例如,OP的讲师与现实脱节;)@蒂乔德罗马也许你不知道?让
A
作为一个基类,可以用3或4种方式进行扩展。它不知道这些是如何实现的,只知道它们提供了哪些签名。我经常看到这样的事情,例如在<代码> MySQL LD> <代码>。我错过了一些事情,但是这两个GLGGL回答都是从OP所要求的子类调用超类方法吗?非常感谢……这正是我所希望的,你可以更明确地用你的问题。C++语言只是多态性。但对于Python来说,这对任何事情都是正确的。。。