python 子類調(diào)用父類的構(gòu)造函數(shù)實例
當子類繼承父類后,需要調(diào)用父類的方法和屬性時,需要調(diào)用父類的初始化函數(shù)。
class A(object): def __init__(self): self.nameaa = 'aa' def funca(self): print('function a %s' % self.nameaa) class B(A): def __init__(self): self.namebb = 'bb' def funcb(self): print('function b %s' % self.namebb) b = B() print(b.namebb) b.funcb() print(b.nameaa) b.funca()
在子類中重寫了構(gòu)造函數(shù),但新的構(gòu)造函數(shù)沒有初始化父類,當沒有初始化父類的構(gòu)造函數(shù)時,就會報錯。
(1)調(diào)用超類的構(gòu)造方法
class A(object): def __init__(self): self.nameaa = 'aa' def funca(self): print('function a %s' % self.nameaa) class B(A): def __init__(self): self.namebb = 'bb' A.__init__(self) #添加 def funcb(self): print('function b %s' % self.namebb) b = B() print(b.namebb) b.funcb() print(b.nameaa) b.funca()
(2)使用super函數(shù)
class A(object): def __init__(self): self.nameaa = 'aa' def funca(self): print('function a %s' % self.nameaa) class B(A): def __init__(self): self.namebb = 'bb' super(B,self).__init__() def funcb(self): print('function b %s' % self.namebb) b = B() print(b.namebb) b.funcb() print(b.nameaa) b.funca()
super函數(shù)返回一個super對象,解析過程自動查找所有的父類和父類的父類,當前類和對象可以作為super函數(shù)的參數(shù)使用,調(diào)用函數(shù)返回的方法是超類的方法。使用super函數(shù)如果子類繼承多個父類只許一次繼承,使用一次super函數(shù)即可。
如果沒有重寫子類的構(gòu)造函數(shù),是可以直接使用父類的屬性和方法的。
class A(object): def __init__(self): self.nameaa = 'aa' def funca(self): print('function a %s' % self.nameaa) class C(A): pass c = C() c.funca() print(c.nameaa)
補充知識:python3 和python2 調(diào)用父類構(gòu)造方法寫法區(qū)別
1. python3 和python2 調(diào)用父類構(gòu)造方法寫法區(qū)別
前一段時間,把之前的一個項目遷移到python3
發(fā)現(xiàn)了很多不同的地方.我這里簡單說明了,構(gòu)造方法的不同 之后可能會繼續(xù)更新不同. 主要針對項目遷移進行總結(jié),反思. 這里就當做筆記.
python3 代碼 調(diào)用父類的構(gòu)造方法
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- """ @author: Frank @contact: frank.chang@shoufuyou.com @file: py2topy3.py @time: 2018/7/7 上午7:09 ## python3 代碼 """ import threading import queue _sentinel = object() class Consumer(threading.Thread): """ 消費者線程類 """ def __init__(self, name, queue): super().__init__(name=name) self.queue = queue def run(self): while True: values = self.queue.get(timeout=None) if values is _sentinel: self.queue.put(values) break ##process values ##xxx print('consume is consuming data {}'.format(values)) print("{} finished".format(self.getName())) if __name__ == '__main__': q = queue.Queue() concumser = Consumer('consumer', q) print(concumser)
2 python2.7 調(diào)用父類的構(gòu)造方法
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- """ @author: Frank @contact: frank.chang@shoufuyou.com @file: 3.py @time: 2018/7/7 上午7:05 """ import Queue import threading # 哨兵 _sentinel = object() class Consumer(threading.Thread): """ 消費者線程類 """ def __init__(self, name, queue): super(Consumer, self).__init__(name=name) self.queue = queue def run(self): while True: values = self.queue.get(timeout=None) if values is _sentinel: self.queue.put(values) break ##process values ##xxx print('consume is consuming data {}'.format(values)) print("{} finished".format(self.getName())) if __name__ == '__main__': q = Queue.Queue() concumser = Consumer('consumer', q) print(concumser)
區(qū)別
主要區(qū)別是 super 的變化,
python3 中直接 super().init() 中 super 不需要傳遞任何參數(shù),直接可以調(diào)用父類的構(gòu)造方法
python2 中 super(Consumer, self).init(), 需要傳兩個參數(shù)一個是類名, 一個是self. 這樣比較麻煩,很容易混淆. 但是python3 這里處理的比較好了.
可以看下這個文檔 https://docs.python.org/3/library/functions.html#super
順便提一下, python2 和python3 中 quque 名稱換了,python3 用的是小寫 作為模塊名稱.
以上這篇python 子類調(diào)用父類的構(gòu)造函數(shù)實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Pycharm中python調(diào)用另一個文件類或者函數(shù)
- Python函數(shù)調(diào)用的幾種方式(類里面,類之間,類外面)
- python中類的相互調(diào)用的實踐
- Python類的定義繼承調(diào)用比較方法技巧
- Python實現(xiàn)子類調(diào)用父類的初始化實例
- python 中不同包 類 方法 之間的調(diào)用詳解
- python 定義類時,實現(xiàn)內(nèi)部方法的互相調(diào)用
- python調(diào)用函數(shù)、類和文件操作簡單實例總結(jié)
- 調(diào)用其他python腳本文件里面的類和方法過程解析
- Python中不同類之間調(diào)用方法的四種方式小結(jié)
相關文章
Django部署到服務器后無法獲取到靜態(tài)元素 The requested resource
寫了一個Django項目,部署到云主機后,訪問發(fā)現(xiàn)圖片無法訪問,報錯The requested resource was not found on this server,下面給大家介紹Django部署到服務器后無法獲取到靜態(tài)元素The requested resource was not found on this server(問題及解決方案),需要的朋友可以參考下2024-02-02Python中使用scapy模擬數(shù)據(jù)包實現(xiàn)arp攻擊、dns放大攻擊例子
這篇文章主要介紹了Python中使用scapy模擬數(shù)據(jù)包實現(xiàn)arp攻擊、dns放大攻擊例子,本文重點在于scapy有使用上,需要的朋友可以參考下2014-10-10