Python繼承擴展內置類
阿新 • • 發佈:2017-12-28
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 = [] forcontact 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繼承擴展內置類