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

熱線電話:13121318867

登錄
首頁精彩閱讀Python類的繼承和多態(tài)代碼詳解
Python類的繼承和多態(tài)代碼詳解
2018-01-25
收藏

Python類的繼承和多態(tài)代碼詳解

Python類的繼承

在OOP(ObjectOrientedProgramming)程序設(shè)計中,當我們定義一個class的時候,可以從某個現(xiàn)有的class繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Baseclass、Superclass)。
我們先來定義一個classPerson,表示人,定義屬性變量name及sex(姓名和性別);
定義一個方法print_title():當sex是male時,printman;當sex是female時,printwoman。參考如下代碼:    
class Person(object):
  def __init__(self,name,sex):
    self.name = name
    self.sex = sex
     
  def print_title(self):
    if self.sex == "male":
      print("man")
    elif self.sex == "female":
      print("woman")
 
class Child(Person):              # Child 繼承 Person
  pass
       
May = Child("May","female")
Peter = Person("Peter","male")
 
print(May.name,May.sex,Peter.name,Peter.sex)  # 子類繼承父類方法及屬性
May.print_title()
Peter.print_title()

而我們編寫Child類,完全可以繼承Person類(Child就是Person);使用classsubclass_name(baseclass_name)來表示繼承;

繼承有什么好處?最大的好處是子類獲得了父類的全部屬性及功能。如下Child類就可以直接使用父類的print_title()方法

實例化Child的時候,子類繼承了父類的構(gòu)造函數(shù),就需要提供父類Person要求的兩個屬性變量name及sex:

在繼承關(guān)系中,如果一個實例的數(shù)據(jù)類型是某個子類,那它也可以被看做是父類(May既是Child又是Person)。但是,反過來就不行(Peter僅是Person,而不是Child)。

繼承還可以一級一級地繼承下來,就好比從爺爺?shù)桨职?、再到兒子這樣的關(guān)系。而任何類,最終都可以追溯到根類object,這些繼承關(guān)系看上去就像一顆倒著的樹。比如如下的繼承樹:

isinstance()及issubclass()

Python與其他語言不同點在于,當我們定義一個class的時候,我們實際上就定義了一種數(shù)據(jù)類型。我們定義的數(shù)據(jù)類型和Python自帶的數(shù)據(jù)類型,比如str、list、dict沒什么兩樣。

Python有兩個判斷繼承的函數(shù):isinstance()用于檢查實例類型;issubclass()用于檢查類繼承。參見下方示例:    
class Person(object):
  pass
 
class Child(Person):         # Child 繼承 Person
  pass
 
May = Child()
Peter = Person()  
 
print(isinstance(May,Child))     # True
print(isinstance(May,Person))    # True
print(isinstance(Peter,Child))    # False
print(isinstance(Peter,Person))   # True
print(issubclass(Child,Person))   # True

Python類的多態(tài)

在說明多態(tài)是什么之前,我們在Child類中重寫print_title()方法:若為male,printboy;若為female,printgirl    
class Person(object):
  def __init__(self,name,sex):
    self.name = name
    self.sex = sex
     
  def print_title(self):
    if self.sex == "male":
      print("man")
    elif self.sex == "female":
      print("woman")
 
class Child(Person):        # Child 繼承 Person
  def print_title(self):
    if self.sex == "male":
      print("boy")
    elif self.sex == "female":
      print("girl")
     
May = Child("May","female")
Peter = Person("Peter","male")
 
print(May.name,May.sex,Peter.name,Peter.sex)
May.print_title()
Peter.print_title()
當子類和父類都存在相同的print_title()方法時,子類的print_title()覆蓋了父類的print_title(),在代碼運行時,會調(diào)用子類的print_title()
這樣,我們就獲得了繼承的另一個好處:多態(tài)。
多態(tài)的好處就是,當我們需要傳入更多的子類,例如新增Teenagers、Grownups等時,我們只需要繼承Person類型就可以了,而print_title()方法既可以直不重寫(即使用Person的),也可以重寫一個特有的。這就是多態(tài)的意思。調(diào)用方只管調(diào)用,不管細節(jié),而當我們新增一種Person的子類時,只要確保新方法編寫正確,而不用管原來的代碼。這就是著名的“開閉”原則:
對擴展開放(Openforextension):允許子類重寫方法函數(shù)
對修改封閉(Closedformodification):不重寫,直接繼承父類方法函數(shù)

子類重寫構(gòu)造函數(shù)
子類可以沒有構(gòu)造函數(shù),表示同父類構(gòu)造一致;子類也可重寫構(gòu)造函數(shù);現(xiàn)在,我們需要在子類Child中新增兩個屬性變量:mother和father,我們可以構(gòu)造如下(建議子類調(diào)用父類的構(gòu)造方法,參見后續(xù)代碼):    
class Person(object):
  def __init__(self,name,sex):
  self.name = name
  self.sex = sex
 
class Child(Person):        # Child 繼承 Person
  def __init__(self,name,sex,mother,father):
    self.name = name
    self.sex = sex
    self.mother = mother
    self.father = father
 
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)  
 
Person
若父類構(gòu)造函數(shù)包含很多屬性,子類僅需新增1、2個,會有不少冗余的代碼,這邊,子類可對父類的構(gòu)造方法進行調(diào)用,參考如下:
class Person(object):
  def __init__(self,name,sex):
    self.name = name
    self.sex = sex
 
class Child(Person):             # Child 繼承 Person
  def __init__(self,name,sex,mother,father):
    Person.__init__(self,name,sex)    # 子類對父類的構(gòu)造方法的調(diào)用
    self.mother = mother
    self.father = father
 
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)

多重繼承

多重繼承的概念應該比較好理解,比如現(xiàn)在需要新建一個類baby繼承Child,可繼承父類及父類上層類的屬性及方法,優(yōu)先使用層類近的方法,代碼參考如下:    
class Person(object):
  def __init__(self,name,sex):
    self.name = name
    self.sex = sex
     
  def print_title(self):
    if self.sex == "male":
      print("man")
    elif self.sex == "female":
      print("woman")
       
class Child(Person):
  pass
 
class Baby(Child):
  pass
 
May = Baby("May","female")    # 繼承上上層父類的屬性
print(May.name,May.sex)      
May.print_title()         # 可使用上上層父類的方法
 
 
class Child(Person):        
  def print_title(self):
    if self.sex == "male":
      print("boy")
    elif self.sex == "female":
      print("girl")
       
class Baby(Child):
  pass
       
May = Baby("May","female")
May.print_title()        # 優(yōu)先使用上層類的方法
總結(jié)
以上就是本文關(guān)于Python類的繼承和多態(tài)代碼詳解的全部內(nèi)容,希望對大家有所幫助。

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

若不方便掃碼,搜微信號: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(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".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 = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+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); }