1. 程式人生 > >Python繼承擴展內置類

Python繼承擴展內置類

hat python oat 如果 擴展 example 聯系 語法 人的

繼承最有趣的應用是給內置類添加功能,在之前的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繼承擴展內置類