python 子類調用父類的構造函數(shù)實例
當子類繼承父類后,需要調用父類的方法和屬性時,需要調用父類的初始化函數(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()
在子類中重寫了構造函數(shù),但新的構造函數(shù)沒有初始化父類,當沒有初始化父類的構造函數(shù)時,就會報錯。

(1)調用超類的構造方法
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ù)使用,調用函數(shù)返回的方法是超類的方法。使用super函數(shù)如果子類繼承多個父類只許一次繼承,使用一次super函數(shù)即可。
如果沒有重寫子類的構造函數(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 調用父類構造方法寫法區(qū)別
1. python3 和python2 調用父類構造方法寫法區(qū)別
前一段時間,把之前的一個項目遷移到python3
發(fā)現(xiàn)了很多不同的地方.我這里簡單說明了,構造方法的不同 之后可能會繼續(xù)更新不同. 主要針對項目遷移進行總結,反思. 這里就當做筆記.
python3 代碼 調用父類的構造方法
#!/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 調用父類的構造方法
#!/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ù),直接可以調用父類的構造方法
python2 中 super(Consumer, self).init(), 需要傳兩個參數(shù)一個是類名, 一個是self. 這樣比較麻煩,很容易混淆. 但是python3 這里處理的比較好了.
可以看下這個文檔 https://docs.python.org/3/library/functions.html#super
順便提一下, python2 和python3 中 quque 名稱換了,python3 用的是小寫 作為模塊名稱.
以上這篇python 子類調用父類的構造函數(shù)實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
python selenium循環(huán)登陸網(wǎng)站的實現(xiàn)
這篇文章主要介紹了python selenium循環(huán)登陸網(wǎng)站的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11
pycharm中使用request和Pytest進行接口測試的方法
這篇文章主要介紹了pycharm中使用request和Pytest進行接口測試的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07

