Python继承扩展内置类

Posted anovana

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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", "[email protected]")
>>> c2 = Contact("John B", "[email protected]")
>>> c3 = Contact("Jenna C", "[email protected]")
>>> [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这些数值偶尔也会做继承。

 

以上是关于Python继承扩展内置类的主要内容,如果未能解决你的问题,请参考以下文章

扩展 SWIG 内置类

python学习8_1 面向对象(继承多态封装)以及零散概念(组合,property,绑定方法与非绑定方法,反射,内置函数)

python 继承机制(子类化内置类型)

Python的内置方法和类的继承举例

Python Expert:如何继承内置类并覆盖每个成员函数 w.r.t.基类成员函数?

Python内置函数之super()