99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀Python多重繼承
Python多重繼承
2017-07-15
收藏

Python多重繼承

在本文中,您將了解Python中的多重繼承以及如何在程序中使用它。還將了解多級(jí)繼承和方法解析順序。

與C++一樣,一個(gè)類可以從Python中的多個(gè)基類派生出來。這被稱為多重繼承。

在多重繼承中,所有基類的特征都被繼承到派生類中。多重繼承的語法類似于單繼承。

Python多重繼承示例

class Base1:
    pass

class Base2:
    pass

class MultiDerived(Base1, Base2):
    pass

這里,MultiDerived派生自Base1和Base2類。

MultiDerived類從Base1和Base2繼承。

Python中的多層繼承

另一方面,我們也可以繼承一個(gè)派生類的形式。這被稱為多級(jí)繼承。 它可以在Python中有任何的深度(層級(jí))。在多級(jí)繼承中,基類和派生類的特性被繼承到新的派生類中。
下面給出了具有相應(yīng)可視化的示例。

class Base:
    pass

class Derived1(Base):
    pass

class Derived2(Derived1):
    pass

這里,Derived1派生自Base,Derived2派生自Derived1。

Python中的方法解析順序

Python中的每個(gè)類都派生自類:object。它是Python中最基礎(chǔ)的類型。

所以在技術(shù)上,所有其他類,無論是內(nèi)置還是用戶定義,都是派生類,所有對(duì)象都是對(duì)象類的實(shí)例。

# Output: True
print(issubclass(list,object))

# Output: True
print(isinstance(5.5,object))

# Output: True
print(isinstance("Hello",object))

在多繼承方案中,在當(dāng)前類中首先搜索任何指定的屬性。如果沒有找到,搜索繼續(xù)進(jìn)入父類,深度優(yōu)先,再到左右的方式,而不需要搜索相同的類兩次。

所以在MultiDerived類的上面的例子中,搜索順序是[MultiDerived,Base1,Base2,object]。 此順序也稱為MultiDerived類的線性化,用于查找此順序的一組規(guī)則稱為方法解析順序(MRO)。

MRO必須防止本地優(yōu)先排序,并提供單調(diào)性。它確保一個(gè)類總是出現(xiàn)在其父類之前,并且在多個(gè)父類的情況下,該順序與基類的元組相同。

一個(gè)類的MRO可以被看作是__mro__屬性或者mro()方法。前者返回一個(gè)元組,而后者返回一個(gè)列表。

>>> MultiDerived.__mro__
(<class '__main__.MultiDerived'>,
 <class '__main__.Base1'>,
 <class '__main__.Base2'>,
 <class 'object'>)

>>> MultiDerived.mro()
[<class '__main__.MultiDerived'>,
 <class '__main__.Base1'>,
 <class '__main__.Base2'>,
 <class 'object'>

這里有一個(gè)更復(fù)雜的多重繼承示例及其可視化圖型。

class X: pass
class Y: pass
class Z: pass

class A(X,Y): pass
class B(Y,Z): pass

class M(B,A,Z): pass

# Output:
# [<class '__main__.M'>, <class '__main__.B'>,
# <class '__main__.A'>, <class '__main__.X'>,
# <class '__main__.Y'>, <class '__main__.Z'>,
# <class 'object'>]

print(M.mro()

參考這一點(diǎn),進(jìn)一步討論MRO并了解實(shí)際算法如何計(jì)算。


數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }