资讯专栏INFORMATION COLUMN

python继承与多重继承

Euphoria / 1086人阅读

摘要:记住以下几点直接子类化内置类型如或容易出错因为内置类型的方法通常会忽略用户覆盖的方法不要子类化内置类型用户自定义的类应该继承模块错误案例错误案例正确案例正确案例多重继承有关的另一个问题就是如果同级别的超类定义了同名属性如何确定使用哪个输出

记住以下几点:

直接子类化内置类型(如dict,liststr)容易出错,因为内置类型的方法通常会忽略用户覆盖的方法,不要子类化内置类型,用户自定义的类应该继承collections模块.

    def __setitem__(self, key, value):
        super().__setitem__(key, [value] * 2) # 错误案例


class AnswerDict(dict):
    def __getitem__(self, item): # 错误案例
        return 42


import collections


class DoppelDict2(collections.UserDict): # 正确案例
    def __setitem__(self, key, value):
        super().__setitem__(key, [value] * 2)


class AnswerDict2(collections.UserDict): # 正确案例
    def __getitem__(self, item):
        return 42

多重继承有关的另一个问题就是:如果同级别的超类定义了同名属性.Python如何确定使用哪个?

class DoppelDict(dict):
    def __setitem__(self, key, value):
        super().__setitem__(key, [value] * 2)


class AnswerDict(dict):
    def __getitem__(self, item):
        return 42


import collections


class DoppelDict2(collections.UserDict):
    def __setitem__(self, key, value):
        super().__setitem__(key, [value] * 2)


class AnswerDict2(collections.UserDict):
    def __getitem__(self, item):
        return 42


class A:
    def ping(self):
        print("Ping:", self)


class B(A):
    def pong(self):
        print("pong:", self)


class C(A):
    def pong(self):
        print("PONG:", self)


class D(B, C):
    def ping(self):
        super().ping()
        print("post-ping:", self)

    def pingpong(self):
        self.ping()
        super().ping()
        self.pong()
        super().pong()
        C.pong(self)
if __name__ == "__main__":

    d = D()
    print(d.pong()) # 输出来源于B
    print(C.pong(d)) #输出来源于C 超类的方法都可以直接调用,此时要把实例作为显示参数传入.

python能区别调用的是哪个方法,通过方法解析顺序
>>> D.mro()
[, , , , ]
若想把方法调用委托给超类,推荐的方式是使用内置的super()函数.

以下是对于d.pingpong()方法的解读

>>> self.ping()

Ping: <__main__.D object at 0x000002213877F2B0> post-ping: <__main__.D object at 0x000002213877F2B0> 第一个调用的是self.ping(),运行的是是D类的ping,方法.

第二个调用的的是super().ping(),跳过D类的ping方法,找到A类的ping方法.Ping: <__main__.D object at 0x000002213877F2B0>

第三个调用的是self.pong()方法,根据__mro__,找到B类实现的pong方法. pong: <__main__.D object at 0x000002213877F2B0>

第四个调用时super().pong(),也是根据__mro__,找到B类实现的pong方法. pong: <__main__.D object at 0x000002213877F2B0>

第五个调用的是C.pong(self),忽略了__mro__,找到的是C类实现的pong方法. PONG: <__main__.D object at 0x000002213877F2B0>

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42426.html

相关文章

  • REST API设计理念 Python Mixin模式

    摘要:飞机就是一种交通工具,可飞行的能力是是飞机的属性,通过继承接口来获取语言可没有接口功能,但是它可以多重继承。说是,因为从语法上看,的确是通过多重继承实现的。所以从含义上理解,只是一个,不是一个。比如飞机照样可以载客,就是不能飞了 REST API设计理念 showImg(https://segmentfault.com/img/remote/1460000019923606);sho...

    waruqi 评论0 收藏0
  • REST API设计理念 Python Mixin模式

    摘要:飞机就是一种交通工具,可飞行的能力是是飞机的属性,通过继承接口来获取语言可没有接口功能,但是它可以多重继承。说是,因为从语法上看,的确是通过多重继承实现的。所以从含义上理解,只是一个,不是一个。比如飞机照样可以载客,就是不能飞了 REST API设计理念 showImg(https://segmentfault.com/img/remote/1460000019923606);sho...

    iflove 评论0 收藏0
  • Python学习之路8.2-对Python类的补充

    摘要:本章主要是对上一章类的补充。对于多态的补充子类可以被看成是父类的类型,但父类不能被看成是子类的类型。仍然以类为例,动物里有哺乳动物,卵生动物,有能飞的动物和不能飞的动物,这是两种大的分类方式。一般在中,以为结尾类的都作为接口。 《Python编程:从入门到实践》笔记。本章主要是对上一章Python类的补充。 1. 从一个类派生出所有类 上一篇文章说道Python类的定义与继承一般是如下...

    liukai90 评论0 收藏0
  • python学习笔记-多重继承和Mixin

    摘要:优先顺序模糊多重继承的优先顺序,方法调用顺序不明确。在松本行弘的松本行弘的程序世界中介绍了中类的几个原则通常的继承用单一继承第二个以及两个以上的父类必须是的抽象类中的多重继承应该也适用。 我们前面理解了类。类就是把具体事物给抽象出来。其实也有归类、类别的意思。我们举一个例子:人的职业有Teacher、Coder、Writer、Singer等职业继承关系就是: Pe...

    wanghui 评论0 收藏0
  • 流畅的python读书笔记-第十章-继承优缺点

    摘要:继承的优缺点推出继承的初衷是让新手顺利使用只有专家才能设计出来的框架。多重继承的真实应用多重继承能发挥积极作用。即便是单继承,这个原则也能提升灵活性,因为子类化是一种紧耦合,而且较高的继承树容易倒。 继承的优缺点 推出继承的初衷是让新手顺利使用只有专家才能设计出来的框架。——Alan Kay 子类化内置类型很麻烦 (如 list 或 dict)) ,别搞这种 直接子类化内置类型(如 ...

    morgan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<