日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Python中的面向?qū)ο缶幊淘斀?下)

 imelee 2016-12-15

繼承

繼承描述了基類的屬性如何“遺傳”給派生類。一個(gè)子類可以繼承它的基類的任何屬性,不管是數(shù)據(jù)屬性還是方法。
創(chuàng)建子類的語法看起來與普通(新式)類沒有區(qū)別,一個(gè)類名,后跟一個(gè)或多個(gè)需要從其中派生的父類:

復(fù)制代碼 代碼如下:

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

實(shí)例
復(fù)制代碼 代碼如下:

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的子類繼承父類后,會把父類的所有的方法,包括構(gòu)造器init()也繼承下來.

復(fù)制代碼 代碼如下:

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()


輸出
復(fù)制代碼 代碼如下:

init Child class instance
call parent func

super關(guān)鍵字

super 是用來解決多重繼承問題的,直接用類名調(diào)用父類方法在使用單繼承的時(shí)候沒問題,但是如果使用多繼承,會涉及到查找順序(MRO)、重復(fù)調(diào)用(鉆石繼承)等種種問題。語法如下

復(fù)制代碼 代碼如下:

super(type[, obj])

示例
復(fù)制代碼 代碼如下:

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

注意

super繼承只能用于新式類,用于經(jīng)典類時(shí)就會報(bào)錯(cuò)。
新式類:必須有繼承的類,如果沒什么想繼承的,那就繼承object
經(jīng)典類:沒有父類,如果此時(shí)調(diào)用super就會出現(xiàn)錯(cuò)誤:『super() argument 1 must be type, not classobj』
實(shí)例

復(fù)制代碼 代碼如下:

class Parent(object):
    def __init__(self):
        self.phone = '123456'
        self.address = 'abcd'

class Child(Parent):
    def __init__(self):
        super(Child, self).__init__()
        self.data = 100

def main():
    child = Child()
    print "phone is: ", child.phone
    print "address is: ", child.address
    print "data is: ", child.data

if __name__ == '__main__':
    main()


輸出
復(fù)制代碼 代碼如下:

phone is:  123456
address is:  abcd
data is:  100

重寫

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

復(fù)制代碼 代碼如下:

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()


輸出
復(fù)制代碼 代碼如下:

init Child class instance
call Child func

多重繼承

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

復(fù)制代碼 代碼如下:

class Father():
    def __init__(self):
        print "init Father instance"

class Mother():
    def __init__(self):
        print "init Mother instance"

class Child(Father, Mother):
    pass


類、實(shí)例和其他對象的內(nèi)建函數(shù)

issubclass()

布爾函數(shù)判斷一個(gè)類是另一個(gè)類的子類或子孫類。它有如下語法:

復(fù)制代碼 代碼如下:

issubclass(sub, sup)

isinstance()

布爾函數(shù)在判定一個(gè)對象是否是另一個(gè)給定類的實(shí)例時(shí),非常有用。它有如下語法:

復(fù)制代碼 代碼如下:

isinstance(obj1, obj2)

attr()系列函數(shù)

●hasattr()
它的目的就是為了決定一個(gè)對象是否有一個(gè)特定的屬性,一般用于訪問某屬性前先作一下檢查。
●getattr()和setattr()
●getattr()和 setattr()函數(shù)相應(yīng)地取得和賦值給對象的屬性,

●delattr()
刪除特定的屬性

實(shí)例

復(fù)制代碼 代碼如下:

class Child(Parent):
    def __init__(self):
        self.data = 100

child = 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')


輸出
復(fù)制代碼 代碼如下:

has data attr? True
delete attr
has data attr? False
set data attr to 200
data attr is:  200

私有化

Python沒有像Java那樣實(shí)現(xiàn)真正的封裝,只是用雙劃線和單劃線實(shí)現(xiàn)私有化.

●雙劃線
防止外部訪問.如在func前加雙劃線,可以防止包括子類的實(shí)例的訪問.

復(fù)制代碼 代碼如下:

    def __func(self):
        print "call"

●單劃線
防止模塊的屬性用“from mymodule import *”來加載。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多