您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

传承麻烦. – Python

5b51 2022/1/14 8:20:43 python 字数 4399 阅读 450 来源 www.jb51.cc/python

有人在这个网站上遇到了同样的问题,但答案与我遇到的问题无关.继承 - 方法调用请考虑以下类定义.class C1(object): def f(self): return 2*self.g() def g(self): return 2 class C2(C1): def f(self):

概述

有人在这个网站上遇到了同样的问题,但答案与我遇到的问题无关.
继承 – 方法调用

请考虑以下类定义.

class C1(object):
    def f(self):
        return 2*self.g()

    def g(self):
        return 2

class C2(C1):
    def f(self):
        return 3*self.g()


class C3(C1):
    def g(self):
        return 5

class C4(C3):
    def f(self):
        return 7*self.g()

obj1 = C1()
obj2 = C2()
obj3 = C3()
obj4 = C4()

对于这个问题,您需要考虑调用f方法调用哪些方法.因此,例如,当调用obj1.f()时,调用C1的f方法,该方法调用C1的g方法.这可以表示为表单的“调用列表”

['C1.f','C1.g'] 

写三个赋值语句,分别将obj2.f()的’调用列表’赋给变量obj2_calls,将obj3.f()的’调用列表’赋给变量obj3_calls,并为obj4分配’调用列表’ .f()到变量obj4_calls.

我理解第一项任务没有问题,它是obj2_calls = [‘C2.f’,’C1.g’]
但我正在试图找出下一个想法.我想因为没有C3.f列表将是[‘C1.f’],但不幸的是它不是.

只是为了清理,这是IS的功课

正如你所说的那样,没有C3.f函数,所以python在MRO中的第一个基类上查找f方法,该方法已经定义了f.在这种情况下,即(C1).现在,该方法(C1.f)调用self.g().在这种情况下,self是C3的一个实例,因此当然,self.g调用C3.g,因为这是MRO中最高的g函数.如果你想保证你得到C1.g,你需要明确地做到:

class C1(object):
    def f(self):
        return 2*C1.g(self)
    def g(self):
        return 5

这也是讨论双下划线名称修改一个很好的引导.由于这是一个单独的主题,也许最好只留下link to some useful documentation.

总结

以上是编程之家为你收集整理的传承麻烦. – Python全部内容,希望文章能够帮你解决传承麻烦. – Python所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶