zoukankan      html  css  js  c++  java
  • Python继承扩展内置类

    继承最有趣的应用是给内置类添加功能,在之前的Contact类中,我们将联系人添加到所有联系人的列表里,如果想通过名字来搜索,那么就可以在Contact类添加一个方法用于搜索,但是这种方法实际上属于列表本身,我们可以使用继承来做:

    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)

    我们创建了一个ContactList来扩展python内置的List,而不是实例化一个普通的列表来作为我们的变量,如下来测试这个新的搜索功能:

    >>> c1 = Contact("John A", "johna@example.com")
    >>> c2 = Contact("John B", "johnb@example.com")
    >>> c3 = Contact("Jenna C", "jennac@example.com")
    >>> [c.name for c in Contact.all_contacts.search('John')]
    ['John A', 'John B']

    用[ ]来创建一个空的列表实际上使用list()创建空列表的简化形式,这两种语法是相同的:

    >>> [] == list()
    True

    所以,list这个数据类型像一个我们可以扩展的类,而不像object。类似我们可以扩展dict类,这种创建字段的形式是繁琐的({:}语法)。

    class LongNameDict(dict):
        def longest_key(self):
            longest = None
            for key in self:
                if not longest or len(key) > len(longest):
                    longest = key
            return longest

    简单测试如下:

    >>> longkeys = LongNameDict()
    >>> longkeys['hello'] = 1
    >>> longkeys['longest yet'] = 5
    >>> longkeys['hello2'] = 'world'
    >>> longkeys.longest_key()
    'longest yet'

    大部分的内置数据类型都可以类似的进行扩展,常见的可扩展的数据类型是object、list、set、dict、file以及str。像int和float这些数值偶尔也会做继承。

  • 相关阅读:
    JDK API文档下载
    idea技巧:查看一个类的所有子类以及子类的子类并以层级关系显示
    Vue项目优化
    deepin 安装netcore 记录
    UOS 下的VScode 使用经验
    UOS操作系统磁盘空间不够一例
    SRPBatcher优化的原理
    我的UOS生活
    假如美国禁用了Unity3D和Unreal怎么办
    BGFX学习笔记01
  • 原文地址:https://www.cnblogs.com/anovana/p/8136319.html
Copyright © 2011-2022 走看看