python物件導向(下)

來源:互聯網
上載者:User

標籤:python   物件導向   

繼承

繼承描述了基類的屬性如何“遺傳”給衍生類別。一個子類可以繼承它的基類的任何屬性,不管是資料屬性還是方法。
建立子類的文法看起來與普通(新式)類沒有區別,一個類名,後跟一個或多個需要從其中派生的父類:

class SubClassName (ParentClass1[, ParentClass2, ...]):    ‘optional class documentation string‘    class_suite

執行個體

class Parent(object): # define parent class 定義父類    def parentMethod(self):    print ‘calling parent method‘class Child(Parent): # define child class 定義子類    def childMethod(self):    print ‘calling child method‘
繼承與覆蓋繼承

不同於Java,python的子類繼承父類後,會把父類的所有的方法,包括構造器init()也繼承下來.

class Parent():    def __init__(self):        print "init Parent class instance"    def func(self):        print "call parent func"class Child(Parent):    def __init__(self):        print "init Child class instance"child = Child()child.func()

輸出

init Child class instance
call parent func

super關鍵字

super 是用來解決多重繼承問題的,直接用類名調用父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到尋找順序(MRO)、重複調用(鑽石繼承)等種種問題。文法如下

super(type[, obj])

樣本

class C(B):    def method(self, arg):        super(C, self).method(arg)

注意

super繼承只能用於新式類,用於經典類時就會報錯。
新式類:必須有繼承的類,如果沒什麼想繼承的,那就繼承object
經典類:沒有父類,如果此時調用super就會出現錯誤:『super() argument 1 must be type, not classobj』

執行個體

class Parent(object):    def __init__(self):        self.phone = ‘123456‘        self.address = ‘abcd‘class Child(Parent):    def __init__(self):        super(Child, self).__init__()        self.data = 100def main():    child = Child()    print "phone is: ", child.phone    print "address is: ", child.address    print "data is: ", child.dataif __name__ == ‘__main__‘:    main()

輸出

phone is:  123456address is:  abcddata is:  100
重寫

子類只要重新定義一個與父類的方法同名的方法,就可以重寫覆蓋父類的方法. 子類只要把上例父類的func(self)重寫就行了.

class Parent():def __init__(self):print "init Parent class instance"def func(self):print "call parent func"class Child(Parent):def __init__(self):print "init Child class instance"child = Child()child.func()

輸出

init Child class instancecall Child func
多重繼承

同 C++一樣,Python 允許子類繼承多個基類。但一般不推薦用多重繼承.文法如下:

class Father():    def __init__(self):        print "init Father instance"class Mother():    def __init__(self):        print "init Mother instance"class Child(Father, Mother):    pass
類、執行個體和其他對象的內建函數issubclass()

布爾函數判斷一個類是另一個類的子類或子孫類。它有如下文法:

issubclass(sub, sup)

isinstance()

布爾函數在判定一個對象是否是另一個給定類的執行個體時,非常有用。它有如下文法:

isinstance(obj1, obj2)

attr()系列函數
  • hasattr()
    它的目的就是為了決定一個對象是否有一個特定的屬性,一般用於訪問某屬性前先作一下檢查。

  • getattr()和setattr()
    getattr()和 setattr()函數相應地取得和賦值給對象的屬性,

  • delattr()
    刪除特定的屬性

執行個體

class Child(Parent):    def __init__(self):        self.data = 100child = Child()print "has data attr?", hasattr(child, ‘data‘)print "delete attr"delattr(child, ‘data‘)print "has data attr?", hasattr(child, ‘data‘)print "set data attr to 200"setattr(child, ‘data‘, 200)print "data attr is: ", getattr(child, ‘data‘)

輸出

has data attr? Truedelete attrhas data attr? Falseset data attr to 200data attr is:  200
私人化

Python沒有像Java那樣實現真正的封裝,只是用雙劃線和單劃線實現私人化.

  • 雙劃線
    防止外部存取.如在func前加雙劃線,可以防止包括子類的執行個體的訪問.
    def __func(self):        print "call"
  • 單劃線
    防止模組的屬性用“from mymodule import *”來載入。

python物件導向(下)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.