python类继承的重写和super
給已經(jīng)存在的類添加新的行為,繼承是非常好的實現(xiàn)方式。但是如果要改變行為呢?比如在Python繼承擴展內(nèi)置類,我們的contact類只允許一個名字和一個郵箱,但是如果要對某些人增加電話號碼呢?這里可以通過非常簡單的給他增加一個電話號碼的屬性來實現(xiàn),但是如果想這第3個變量在初始化類的時候就可用,就需要重寫__init__函數(shù)。
重寫就是在子類里用一個(和超類相同的名字)新的方法來改變或者覆蓋超類里的這個方法。做這個不需要特殊的語法,會自動執(zhí)行子類新創(chuàng)建的方法而不是超類的方法。以下是在之前Contact類中,使用Friend子類來繼承
class ContactList(list):def search(self, name):'''Return all contacts that contain the search valuein their name.'''matching_contacts = []for contact in self:if name in contact.name:matching_contacts.append(contact)return matching_contactsclass Contact:all_contacts = ContactList()def __init__(self, name, email):self.name = nameself.email = emailContact.all_contacts.append(self)class Supplier(Contact):def order(self, order):print("If this were a real system we would send""{} order to {}".format(order, self.name))class Friend(Contact):'''以下是重寫方法,注意這個方法沒有將name和email等加入父類的all_contact '''def __init__(self, name, email, phone):self.name = name self.email = emailself.phone = phoneclass Friend1(Contact):'''通過super得到父類對象的實例,并且調(diào)用這個對象的__init__方法,傳遞給它預(yù)期的參數(shù),然后這個類做了自己的初始化,即設(shè)置phone屬性'''def __init__(self, name, email, phone):super().__init__(name, email)self.phone = phone不只有__init__,任何方法都可以被重寫。在這個例子中,Contact和Friend類有重復(fù)的代碼來創(chuàng)建name和email,這會導致維護變得復(fù)雜。需要警惕的是,Friend類忽略了把自己加到all_contacts列表里,這個列表是我們在Contact類里創(chuàng)建的。將以上代碼保存為order.py腳本,如下是在交互的解釋器里運行的結(jié)果如下:
$ python -i order.py >>> c1 = Contact("John A", "johna@example.com") >>> c2 = Contact("John B", "johnb@example.com") >>> c3 = Contact("Jenna C", "jennac@example.com") >>> c4 = Friend("Friend c", "Friendc@example.com",'0592-5566778') >>> c5 = Friend("Friend 5", "Friend5@example.com",'0592-1122334') >>> c6 = Friend1("Friend 6", "Friend6@example.com",'0592-4455667') >>> c7 = Friend1("Friend 7", "Friend7@example.com",'0592-7788990') >>> [c.name for c in Contact.all_contacts] ['John A', 'John B', 'Jenna C', 'Friend 6', 'Friend 7']我們真正需要的是一種可以調(diào)用父類的代碼的方法,這個就是super函數(shù)的功能,他返回一個父類的實例化對象,允許我們直接調(diào)用父類的方法,如上例中的Friend1類。
super()可以在任何方法中調(diào)用,不只是__init__方法,這就意味著通過重寫和調(diào)用super,可以修改所有的方法??梢栽诜椒ǖ娜魏挝恢糜胹uper。
?
參考:
1、《Python3 面向?qū)ο缶幊獭?[加]Dusty Philips 著
轉(zhuǎn)載于:https://www.cnblogs.com/anovana/p/8142686.html
總結(jié)
以上是生活随笔為你收集整理的python类继承的重写和super的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 事务相关报错记录
- 下一篇: 【26】Python Iterator笔