zoukankan      html  css  js  c++  java
  • python对象的多重继承

    一个从多个父类继承过来的子类,可以访问所有父类的功能。并不推荐使用。

    多重继承最简单有用的形式是mixin。假设在之前Contact类增加一个功能,允许给self.email发送一封邮件。

    class ContactList(list):
        def search(self, name):
            '''Return all contacts that contain the search value
               in their name.'''
            matching_contacts = []
            for contact in self:
                if name in contact.name:
                    matching_contacts.append(contact)
            return matching_contacts
    
    class Contact:
        all_contacts = ContactList()
      
        def __init__(self, name, email):
            self.name = name
            self.email = email
            Contact.all_contacts.append(self)
    
    class MailSender:
        def send_mail(self, message):
            print("Sending mail to " + self.email)
            # 这里添加发送邮件逻辑
    
    class EmailableContact(Contact, MailSender):
        pass

    EmailableContact这个类不做任何特别的事(实际上,它仅仅是起到一个独立的类的作用),但是通过多重继承,他允许我们定义一个新的类,这个类既是Contact又是MailSender。

    多重继承的语法就像定义里的参数列表,括号里可以包含两个(或者更多的)基类而不是一个,这些基类使用逗号分隔开。执行如下:

    >>> e = EmailableContact("John Smith", "jsmith@example.net")
    >>> Contact.all_contacts
    [<__main__.EmailableContact object at 0x10ae49128>]
    >>> [c.name for c in Contact.all_contacts]
    ['John Smith']
    >>> e.send_mail("Hello, test e-mail here")
    Sending mail to jsmith@example.net

    Contact类的初始化函数仍然会把一个新的联系人添加到all_contacts这个列表。并且可以发送给件给self.email。

    当混合不同类的方法时,多重继承可以很好的工作,但是,当我们要调用超类的方法时,这将会变得非常混乱。因为这里有多个父类,你怎么知道调用哪个呢?如何知道调用他们的顺序呢?

    参考:

    1、《Python3 面向对象编程》 [加]Dusty Philips 著

  • 相关阅读:
    C函数
    iOS开发- 蓝牙后台接收数据(BLE4.0)
    相册权限 第一次安装、用户是否授权
    使用免费的产品搭建直播系统
    搭建HTTP Live Streaming直播系统
    HTTP Live Streaming直播(iOS直播)技术分析与实现
    个人工作总结03
    个人工作总结02
    个人工作总结01
    第七周学习进度
  • 原文地址:https://www.cnblogs.com/anovana/p/8142798.html
Copyright © 2011-2022 走看看