成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python OOP 面向?qū)ο缶幊?

weknow619 / 2187人閱讀

摘要:時(shí)代,如果需要手動(dòng)繼承,如多態(tài)多態(tài)是指,不同的子類對(duì)象調(diào)用相同的父類方法,會(huì)產(chǎn)生多態(tài)多樣結(jié)果的編程特性。

參考:黑馬程序員教程 - Python基礎(chǔ) 面向?qū)ο?/p>

OOP三大特性,且三個(gè)特性是有順序的:

封裝

繼承

多態(tài)

封裝

指的就是把現(xiàn)實(shí)世界的事務(wù),封裝、抽象成編程里的對(duì)象,包括各種屬性和方法。
這個(gè)一般都很簡(jiǎn)單,不需要多講。

唯一要注意的就是:推薦從小往大開始封裝、開發(fā)類。比如手槍,子彈這兩個(gè)類,我們需要先定義和開發(fā)子彈的所有屬性和方法,然后再去開發(fā)上一層的手槍。這樣的話會(huì)很方便。反過來開發(fā)手槍的適合,發(fā)現(xiàn)寫到一半寫不下去要到子彈那里寫,就很亂了。
繼承

子類可以繼承父類和父父類的所有屬性、方法。

繼承格式:

class Parent:
    def func1(self):
        pass

class Son(Parent):
    def func2(self):
        func1()

方法改寫:
子類在不滿意時(shí),也可以進(jìn)行自己的改寫父類的屬性、方法。
其中有兩種情況:

Overwrite 覆蓋重寫父類方法:只需要寫一個(gè)同名函數(shù)即可覆蓋。

Extend 擴(kuò)展父類函數(shù):

第一種方式(主要):寫一個(gè)同名函數(shù),并在其中通過super().func()引用父類方法。其中super是一個(gè)python builtin 特殊類,而super()即生成一個(gè)super的實(shí)例。在子類中生成super實(shí)例,會(huì)得到父類的引用。

第二種方式(python 2.x以前使用):寫一個(gè)同名函數(shù),再通過ParentName.func(self)引用父類方法。但是不推薦,因?yàn)楦割惷Q改變的話所有的子類都要改。

私有不繼承:
子類能夠繼承的只是父類的公開內(nèi)容,但是不包括父類的私有內(nèi)容。
如果要訪問的話也可以,但是需要間接的調(diào)用父類再用方法調(diào)用私有內(nèi)容。

多繼承

Python中,子類是可以同時(shí)有多個(gè)父類的:也就是能夠同時(shí)繼承多個(gè)父類的所有屬性、方法。

繼承格式:

class Father:
    def func1(self):
        pass

class Mother:
    def func2(self):
        pass

class Son(Father, Mother):
    def func3(self):
        func1()
        func2()

注意:
如果多個(gè)父類間存在有同名的方法,那么會(huì)繼承第一個(gè)父類的方法。

MRO, Method Resolution Order

查看繼承順序:
通過類自帶的.__mro__屬性(MRO, Method Resolution Order),可以查看這個(gè)類的繼承順序。

子類可以直接寫FatherName.func()來調(diào)用父級(jí)函數(shù)。
但是當(dāng)子類用super().func()時(shí)候,python就會(huì)根據(jù)MRO順序,由近到遠(yuǎn)逐次尋找,找到最近的上級(jí)則返回。

用上例,如果是多繼承的話,那么尋找順序是:SON -> Father -> Mother -> object

查看類的內(nèi)置屬性和方法:

dir(className)可以查看內(nèi)置所有屬性方法。

Python內(nèi)置的object基礎(chǔ)類

Python3開始使用新式的類定義,即默認(rèn)讓所有定義的類都自動(dòng)繼承一個(gè)叫object的內(nèi)置基礎(chǔ)類。object基礎(chǔ)類定義了很多方便的屬性。包括18項(xiàng)之多。
而舊式的Python2.x時(shí)代,不繼承object基礎(chǔ)類,自己定義的類就只有__doc____module__兩樣內(nèi)置屬性而已。2.x時(shí)代,如果需要手動(dòng)繼承,如:

class MyClass(object):
    pass
多態(tài)

多態(tài)是指,不同的子類對(duì)象調(diào)用相同的父類方法,會(huì)產(chǎn)生多態(tài)多樣結(jié)果的編程特性。
多態(tài)的前提是能夠繼承父類的方法,且能夠重寫改寫父類的方法。

多態(tài)的特點(diǎn):

是調(diào)用方法的技巧,而不影響類的內(nèi)部設(shè)計(jì)

可以增加代碼靈活度

def Father():
    def work(self):
        do_job()
     
    def do_job(self):
        print("Farming on the field...")


def Son(Father):
    def do_job(self):
        print("Programming at an office...")

# ---- Now let"s work ----
Jason = Son()
Jason.work()

以上代碼中,同樣是work()函數(shù),且要do_work()。但是,不同的人調(diào)用的是不同的do_work
Father調(diào)用自己的do_work,兒子因?yàn)樽约褐貙懥薲o_work,所以調(diào)用自己的方法。
這就是多態(tài)——所繼承的方法,不需要再特殊指定誰用什么方法,而對(duì)象會(huì)自動(dòng)調(diào)用適合自己的方法。

類與實(shí)例

Python中,實(shí)例是一個(gè)對(duì)象,類也是一個(gè)對(duì)象,一切皆對(duì)象。但這也是Python OOP中引起很多麻煩的原因。

實(shí)例對(duì)象非常好理解,也好用,直接用,就不說了。但是類對(duì)象就不那么好理解了。

簡(jiǎn)單說,類對(duì)象也是一個(gè)標(biāo)準(zhǔn)的對(duì)象,有自己的屬性和方法,只不過能夠像模版一樣生成多個(gè)實(shí)例對(duì)象而已。
類對(duì)象有這兩大研究點(diǎn):

類屬性:就是能讓所有實(shí)例訪問和操作的公用廁所

定義類屬性:位于class的所有方法之外

訪問類屬性:className.propertyName

類方法:比較難理解,必須用到名為@classmethod的裝飾器,函數(shù)的第一個(gè)參數(shù)必須是關(guān)鍵字cls,如同self。

@classmethod裝飾器:用來告訴解釋器這是一個(gè)類方法,而不是實(shí)例方法。

cls參數(shù):

類屬性與實(shí)例屬性

這是Python OOP中困擾很多人的特點(diǎn)。但是其實(shí)不難理解,總結(jié)如下:

class MyClass:
    # 在這個(gè)位置定義的,叫類屬性。==等同于其它語言的“靜態(tài)屬性”
    # 這是每個(gè)實(shí)例共有的公用屬性,相當(dāng)于宿舍的公用洗澡間
    count = 0
    
    def __init__(self):
        # 用self.定義的,叫實(shí)例屬性,是每個(gè)實(shí)例只自己所有的屬性,selfish
        self.name = "Jason"

訪問類屬性的方法有兩種:

ClassName.propertyName:推薦,直接用類名訪問類屬性。

Instance.propertyName:不推薦用實(shí)例名訪問類屬性,因?yàn)槿绻枰獙懭氩僮鳎敲催@種方法只會(huì)給自己添加一個(gè)實(shí)例屬性,而不會(huì)影響類屬性。

動(dòng)態(tài)添加類屬性

方法一:

>>> MyClass.newAttribute = "I am a class attribute"
>>> print( MyClass.newAttribute )
"I am a class attribute"

方法二:裝飾器

# Customized decorator for classproperty
class classproperty(object):
    def __init__(self, getter):
        self.getter= getter
    def __get__(self, instance, owner):
        return self.getter(owner)

class MyClass:
    @classproperty
    def newAttribute(cls):
        return "I am a class attribute."

>>> print( MyClass.newAttribute )
"I am a class attribute"

之所以把方法封裝為一個(gè)類屬性,是因?yàn)槲覀冇袝r(shí)候需要根據(jù)其它類屬性來定制這個(gè)類屬性。
而一般情況下,我們沒法在類屬性定義的時(shí)候獲得當(dāng)前的類或類中其它的屬性。

類方法

類方法如同類屬性,是屬于全類的方法,但是(推薦)只用來訪問類屬性。

類方法:比較難理解,必須用到名為@classmethod的裝飾器,函數(shù)的第一個(gè)參數(shù)必須是關(guān)鍵字cls,如同self

@classmethod裝飾器:用來告訴解釋器這是一個(gè)類方法,而不是實(shí)例方法。

cls參數(shù):如同self,用來指代當(dāng)前的類。

注意:@classmethodcls都是關(guān)鍵字,不能改。

代碼:

class MyClass:
    # 定義一個(gè)“類屬性”
    count = 0
    
    # 這里開始定義“類方法”
    @classmethod
    def func(cls):
        print(cls.count)
類靜態(tài)方法

類中的staticmethod裝飾器同樣是python基礎(chǔ)類object的一個(gè)用于包裝、裝飾的方法。一旦在類方法前放上裝飾器@staticmethod,方法就會(huì)轉(zhuǎn)換為一個(gè)靜態(tài)方法。
靜態(tài)方法就是一個(gè)非常獨(dú)立的方法:既不訪問實(shí)例的信息,也不訪問類的信息。

代碼:

class MyClass:
    # 定義一個(gè)“類屬性”
    count = 0
    
    # 這里開始定義“類方法”
    @staticmethod
    def func():
        pass
Property屬性

類中的property裝飾器,也是python基礎(chǔ)類object的一個(gè)用于包裝、裝飾的方法。一旦類方法前放上裝飾器@property,方法就會(huì)轉(zhuǎn)換為一個(gè)類屬性。很多時(shí)候把方法偽裝成屬性,是非常方便的。

class MyClass:
    # 這里開始定義由方法轉(zhuǎn)換為“類屬性”
    @property
    def name(self):
        return "Jason"

c = MyClass()
print( c.name )

在繼承object基礎(chǔ)類的情況下,python給出了三種類屬性裝飾,對(duì)應(yīng)三種操作:

讀?。?b>@property

寫入:@name.setter

刪除:@name.deleter

也就是說,當(dāng)你讀取類屬性my_name的時(shí)候,會(huì)調(diào)用被@property修飾的方法;當(dāng)你修改my_name當(dāng)時(shí)候,會(huì)調(diào)用被@my_name.setter修飾的方法;當(dāng)你刪除這個(gè)屬性時(shí),會(huì)調(diào)用被@my_name.deleter修飾的方法。

注意:

其中@property, @*.setter, @*.deleter,這是固定的名字,不能改。

三種操作所修飾的三個(gè)函數(shù),必須都是同一個(gè)名字:即“類屬性”名。

代碼:

class MyClass:
    # 這里開始定義由方法轉(zhuǎn)換為“類屬性”
    @property
    def name(self):
        return "Jason"

    @name.setter
    def name(self, value):
        self.name = value

    @name.deleter
    def name(self):
        del "Jason"

c = MyClass()

print( c.name )  # READ
c.name = "Brown"  # SET
del c.name  # DELETE
property屬性的應(yīng)用

很多OOP語言,針對(duì)property屬性,一般操作是:一個(gè)私有屬性,配合兩個(gè)公有方法。
如:

class MyClass:
    def __init__(self):
        self.__name = "Jason"

    def get_name(self):
        return self.__name

    def set_name(self, value):
        self.__name = value

c = MyClass()

# 開始調(diào)用
c.set_name("Brownee")
print( c.get_name() )

在Python下,可以利用裝飾器改為以下代碼,極大方便調(diào)用的過程:

class MyClass:
    def __init__(self):
        self.__name = "Jason"

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, value):
        self.__name = value

c = MyClass()

# 開始調(diào)用
c.name = "Brownee"
print( c.name )

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42979.html

相關(guān)文章

  • Python 面向對(duì)象編程OOP (一) 類,對(duì)象,屬性,訪問權(quán)限

    摘要:面向?qū)ο缶幊讨镁幊淌鞘裁创蠹液茫鳛樾“?,最近學(xué)習(xí)了很多編程的知識(shí),因?yàn)槟X容量有限,特此一一按照學(xué)習(xí)順序記錄下來,如果哪里有錯(cuò)誤,還請(qǐng)大神盡快指出,以免誤導(dǎo)他人。。。繼承也允許把一個(gè)派生類的對(duì)象作為一個(gè)基類對(duì)象對(duì)待。 Python面向?qū)ο缶幊讨?OOP編程是什么 大家好,作為小白,最近學(xué)習(xí)了很多Python OOP編程的知識(shí),因?yàn)槟X容量有限,特此一一按照學(xué)習(xí)順序記錄下來,如果哪里有...

    hiyayiji 評(píng)論0 收藏0
  • Python 面向對(duì)象編程OOP (三) 類方法,靜態(tài)方法

    摘要:類的方法概覽首先回顧一下常見的三種方法實(shí)例接口方法類方法靜態(tài)方法標(biāo)準(zhǔn)書寫方式如下我們最常用的其實(shí)就是普通的接口方法,其他兩個(gè)需要用類似裝飾器的寫法來標(biāo)注。類方法接受一個(gè)作為參數(shù),它是指向本身的,并不是所創(chuàng)建的實(shí)例。 類的方法概覽 首先回顧一下Python OOP常見的三種方法: instance method 實(shí)例/接口方法 class method 類方法 static...

    JerryZou 評(píng)論0 收藏0
  • python難點(diǎn):面向對(duì)象編程OOP

    摘要:學(xué)習(xí)廖雪峰官方網(wǎng)站教程總結(jié)面向?qū)ο缶幊炭偨Y(jié),供日后參考類和實(shí)例類的定義限制實(shí)例只能添加指定的屬性類屬性初始化值,創(chuàng)建實(shí)例必須綁定的屬性變量設(shè)置,保證類內(nèi)部數(shù)據(jù)安全創(chuàng)建類,實(shí)質(zhì)上是元類,類的定義本質(zhì)上就是利用創(chuàng)建類先定義函數(shù)創(chuàng)建實(shí)例報(bào)錯(cuò),不能 學(xué)習(xí)廖雪峰官方網(wǎng)站python教程總結(jié)python面向?qū)ο缶幊蘋OP(Object Oriented Programming)總結(jié),供日后參考1....

    stonezhu 評(píng)論0 收藏0
  • [零基礎(chǔ)學(xué)python]關(guān)于類的初步認(rèn)識(shí)

    摘要:反對(duì)者在某些領(lǐng)域?qū)Υ擞枰苑裾J(rèn)。下面再引用一段來自維基百科中關(guān)于的歷史。類的更嚴(yán)格的定義是由某種特定的元數(shù)據(jù)所組成的內(nèi)聚的包。類還可以有運(yùn)行時(shí)表示形式元對(duì)象,它為操作與類相關(guān)的元數(shù)據(jù)提供了運(yùn)行時(shí)支持。 在開始部分,請(qǐng)看官非常非常耐心地閱讀下面幾個(gè)枯燥的術(shù)語解釋,本來這不符合本教程的風(fēng)格,但是,請(qǐng)看官諒解,因?yàn)榱形粚硪欢ㄒ喿x枯燥的東西的。這些枯燥的屬于解釋,均來自維基百科。 1、問題...

    王巖威 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<