python 子類調(diào)用父類的構(gòu)造函數(shù)實(shí)例
當(dāng)子類繼承父類后,需要調(diào)用父類的方法和屬性時(shí),需要調(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ù)沒有初始化父類,當(dāng)沒有初始化父類的構(gòu)造函數(shù)時(shí),就會(huì)報(bào)錯(cuò)。

(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ù)返回一個(gè)super對(duì)象,解析過程自動(dòng)查找所有的父類和父類的父類,當(dāng)前類和對(duì)象可以作為super函數(shù)的參數(shù)使用,調(diào)用函數(shù)返回的方法是超類的方法。使用super函數(shù)如果子類繼承多個(gè)父類只許一次繼承,使用一次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)

補(bǔ)充知識(shí):python3 和python2 調(diào)用父類構(gòu)造方法寫法區(qū)別
1. python3 和python2 調(diào)用父類構(gòu)造方法寫法區(qū)別
前一段時(shí)間,把之前的一個(gè)項(xiàng)目遷移到python3
發(fā)現(xiàn)了很多不同的地方.我這里簡(jiǎn)單說明了,構(gòu)造方法的不同 之后可能會(huì)繼續(xù)更新不同. 主要針對(duì)項(xiàng)目遷移進(jìn)行總結(jié),反思. 這里就當(dāng)做筆記.
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):
"""
消費(fèi)者線程類
"""
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):
"""
消費(fèi)者線程類
"""
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(), 需要傳兩個(gè)參數(shù)一個(gè)是類名, 一個(gè)是self. 這樣比較麻煩,很容易混淆. 但是python3 這里處理的比較好了.
可以看下這個(gè)文檔 https://docs.python.org/3/library/functions.html#super
順便提一下, python2 和python3 中 quque 名稱換了,python3 用的是小寫 作為模塊名稱.
以上這篇python 子類調(diào)用父類的構(gòu)造函數(shù)實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Pycharm中python調(diào)用另一個(gè)文件類或者函數(shù)
- Python函數(shù)調(diào)用的幾種方式(類里面,類之間,類外面)
- python中類的相互調(diào)用的實(shí)踐
- Python類的定義繼承調(diào)用比較方法技巧
- Python實(shí)現(xiàn)子類調(diào)用父類的初始化實(shí)例
- python 中不同包 類 方法 之間的調(diào)用詳解
- python 定義類時(shí),實(shí)現(xiàn)內(nèi)部方法的互相調(diào)用
- python調(diào)用函數(shù)、類和文件操作簡(jiǎn)單實(shí)例總結(jié)
- 調(diào)用其他python腳本文件里面的類和方法過程解析
- Python中不同類之間調(diào)用方法的四種方式小結(jié)
相關(guān)文章
python selenium循環(huán)登陸網(wǎng)站的實(shí)現(xiàn)
這篇文章主要介紹了python selenium循環(huán)登陸網(wǎng)站的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
pycharm中使用request和Pytest進(jìn)行接口測(cè)試的方法
這篇文章主要介紹了pycharm中使用request和Pytest進(jìn)行接口測(cè)試的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Python無權(quán)點(diǎn)文件轉(zhuǎn)化成鄰接矩陣方式
這篇文章主要介紹了Python無權(quán)點(diǎn)文件轉(zhuǎn)化成鄰接矩陣方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Python學(xué)習(xí)筆記之列表推導(dǎo)式實(shí)例分析
這篇文章主要介紹了Python學(xué)習(xí)筆記之列表推導(dǎo)式,結(jié)合實(shí)例形式分析Python列表推導(dǎo)式的原理、寫法與相關(guān)使用技巧,需要的朋友可以參考下2019-08-08
如何通過Python實(shí)現(xiàn)定時(shí)打卡小程序
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)定時(shí)打卡小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11

