最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python面向?qū)ο箢惥帉懠?xì)節(jié)分析【類,方法,繼承,超類,接口等】

 更新時(shí)間:2019年01月05日 15:22:14   作者:KLeonard  
這篇文章主要介紹了Python面向?qū)ο箢惥帉懠?xì)節(jié),較為詳細(xì)的分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中類,方法,繼承,超類,接口等相關(guān)概念、使用技巧與注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Python面向?qū)ο箢惥帉懠夹g(shù)細(xì)節(jié)。分享給大家供大家參考,具體如下:

類代碼編寫細(xì)節(jié)

繼續(xù)學(xué)習(xí)類、方法和繼承。

class語(yǔ)句

以下是class語(yǔ)句的一般形式:

class <name>(superclass,...):
  data = value
  def method(self,...):
    self.member = value

在class語(yǔ)句內(nèi),任何賦值語(yǔ)句都會(huì)產(chǎn)生類屬性,而且還有特殊名稱方法重載運(yùn)算符。例如,名為__init__的函數(shù)會(huì)在實(shí)例對(duì)象構(gòu)造時(shí)調(diào)用(如果定義過的話)。

例子

類是命名空間,也就是定義變量名(屬性)的工具。

1.就像函數(shù)一樣,class語(yǔ)句是本地作用域,由內(nèi)嵌的賦值語(yǔ)句建立的變量名,就存在于這個(gè)本地作用域內(nèi)。

2.就像模塊內(nèi)的變量名,在class語(yǔ)句內(nèi)賦值的變量名會(huì)變成類對(duì)象中的屬性。

因?yàn)閏lass是復(fù)合語(yǔ)句,所以任何種類的語(yǔ)句都可位于其主體內(nèi):print、=、if、def等。當(dāng)class語(yǔ)句自身執(zhí)行時(shí),class語(yǔ)句內(nèi)的所有語(yǔ)句都會(huì)執(zhí)行。在class語(yǔ)句內(nèi)賦值的變量名,會(huì)創(chuàng)建類屬性,而內(nèi)嵌的def則會(huì)創(chuàng)建類方法。

例如,把簡(jiǎn)單的非函數(shù)的對(duì)象賦值給類屬性,就會(huì)產(chǎn)生數(shù)據(jù)屬性,由所有實(shí)例共享。

>>> class ShareData:
  spam = 42
>>> x = ShareData()
>>> y = ShareData()
>>> x.spam,y.spam
(42, 42)

在這里,因?yàn)樽兞棵鹲pam是在class語(yǔ)句的頂層進(jìn)行賦值的,因此會(huì)附加在這個(gè)類中,從而為所有的實(shí)例共享。我們可通過類名稱修改它,或者是通過實(shí)例或類引用它。

>>> ShareData.spam = 99
>>> x.spam,y.spam,ShareData.spam
(99, 99, 99)

這種類屬性可以用于管理貫穿所有實(shí)例的信息。例如,所產(chǎn)生的實(shí)例的數(shù)目的計(jì)數(shù)器。

現(xiàn)在,如果通過實(shí)例而不是類來(lái)給變量名spam賦值時(shí),看看會(huì)發(fā)生什么:

>>> x.spam = 88
>>> x.spam,y.spam,ShareData.spam
(88, 99, 99)

對(duì)實(shí)例的屬性進(jìn)行賦值運(yùn)算會(huì)在該實(shí)例內(nèi)創(chuàng)建或修改變量名,而不是在共享的類中。

對(duì)對(duì)象屬性進(jìn)行賦值總是會(huì)修改該對(duì)象,除此之外沒有其他的影響。例如,y.spam會(huì)通過繼承而在類中查找,但是,對(duì)x.spam進(jìn)行賦值運(yùn)算則會(huì)把該變量名附加在x本身上。

看下面這個(gè)例子,可以更容易理解這種行為,把相同的變量名儲(chǔ)存在兩個(gè)位置:

>>> class MixedNames:
  data = 'spam'
  def __init__(self,value):
    self.data = value
  def display(self):
    print(self.data,MixedNames.data)

當(dāng)創(chuàng)建這個(gè)類的實(shí)例的時(shí)候,變量名data會(huì)在構(gòu)造函數(shù)方法內(nèi)對(duì)self.data進(jìn)行賦值運(yùn)算,從而把data附加到這些實(shí)例上。

>>> x = MixedNames(1)
>>> y = MixedNames(2)
>>> x.display(),y.display()
1 spam
2 spam
(None, None)

【這里的(None,None)是調(diào)用display函數(shù)的返回值】

結(jié)果就是,data存在于兩個(gè)地方:在實(shí)例對(duì)象內(nèi)(由__init__中的self.data賦值運(yùn)算所創(chuàng)建)以及在實(shí)例繼承變量名的類中(由類中的data賦值運(yùn)算所創(chuàng)建)。類的display方法打印了這兩個(gè)版本,先以點(diǎn)號(hào)運(yùn)算得到self實(shí)例的屬性,然后才是類。

利用這些技術(shù)把屬性儲(chǔ)存在不同對(duì)象內(nèi),我們可以決定其可見范圍。附加在類上時(shí),變量名是共享的;附加在實(shí)例上時(shí),變量名是屬于每個(gè)實(shí)例的數(shù)據(jù),而不是共享的數(shù)據(jù)。

方法

方法即函數(shù)。方法在class中是由def語(yǔ)句創(chuàng)建的函數(shù)對(duì)象。從抽象的角度來(lái)看,方法替實(shí)例對(duì)象提供了要繼承的行為。從程序的角度看,方法與簡(jiǎn)單函數(shù)的工作方式完全一致,只是有一個(gè)重要的差別:方法的第一個(gè)參數(shù)總是接收方法調(diào)用的隱性主體,也就是實(shí)例對(duì)象。

Python會(huì)自動(dòng)把實(shí)例方法的調(diào)用對(duì)應(yīng)到類方法函數(shù)。如下所示,方法調(diào)用需要通過實(shí)例,就像這樣:

instance.method(args...)

這會(huì)自動(dòng)翻譯成以下形式的類方法函數(shù)調(diào)用:

class.method(instance,args...)

class通過Python繼承搜索流程找出方法名稱所在之處。事實(shí)上,兩種調(diào)用形式在Python中都有效。

在類方法中,按慣例第一個(gè)參數(shù)通常都稱為self(嚴(yán)格來(lái)說(shuō),只有其位置重要,而不是它的名稱)。這個(gè)參數(shù)給方法提供了一個(gè)鉤子,從而返回調(diào)用的主體,也就是實(shí)例對(duì)象:因?yàn)轭惪梢援a(chǎn)生許多實(shí)例對(duì)象,所以需要這個(gè)參數(shù)來(lái)慣例每個(gè)實(shí)例彼此各不相同的數(shù)據(jù)。

例子

定義下面這個(gè)類:

>>> class NextClass:
  def printer(self,text):
    self.message = text
    print(self.message)

我們通過實(shí)例調(diào)用printer方法如下:

>>> x = NextClass()
>>> x.printer('instance call')
instance call
>>> x.message
'instance call'

當(dāng)通過實(shí)例進(jìn)行點(diǎn)號(hào)運(yùn)算調(diào)用它時(shí),printer會(huì)先通過繼承將其定位,然后它的self參數(shù)會(huì)自動(dòng)賦值為實(shí)例對(duì)象(x)。text參數(shù)會(huì)獲得在調(diào)用時(shí)傳入的字符串('instance call')。注意:因?yàn)镻ython會(huì)自動(dòng)傳遞第一個(gè)參數(shù)給self,實(shí)際上只需要傳遞一個(gè)參數(shù)。在printer中,變量名self是用于讀取或設(shè)置每個(gè)實(shí)例的數(shù)據(jù)的,因?yàn)閟elf引用的是當(dāng)前正在處理的實(shí)例。

方法能通過實(shí)例或類本身兩種方法其中的任意一種進(jìn)行調(diào)用。例如,我們也可以通過類的名稱調(diào)用printer,只要明確地傳遞了一個(gè)實(shí)例給self參數(shù)。

>>> NextClass.printer(x,'class call')#Direct Class Call
class call
>>> x.message
'class call'

通過實(shí)例和類的調(diào)用具有相同的效果,只要在類形式中傳遞了相同的實(shí)例對(duì)象。實(shí)際上,在默認(rèn)情況下,如果嘗試不帶任何實(shí)例調(diào)用的方法時(shí),就會(huì)得到出錯(cuò)信息。

>>> NextClass.printer('bad call')
Traceback (most recent call last):
 File "<pyshell#35>", line 1, in <module>
  NextClass.printer('bad call')
TypeError: printer() missing 1 required positional argument: 'text'

調(diào)用超類構(gòu)造函數(shù)

在構(gòu)造時(shí),Python會(huì)找出并且只調(diào)用一個(gè)__init__。如果保證子類的構(gòu)造函數(shù)也會(huì)執(zhí)行超類構(gòu)造時(shí)的邏輯,一般都必須通過類明確地調(diào)用超類的__init__方法。

class Super:
  def __init__(self,x):
    ...default code...
class Sub(Super):
  def __init__(self,x,y):
    Super.__init__(self,x)
    ...custom code...
I = Sub(1,2)

這種寫法便于維護(hù)代碼,之前也介紹過。這種方法擴(kuò)展了超類的方法,而不是完全取代了它。

類接口技術(shù)

擴(kuò)展只是一種與超類接口的方法。下面所示的specialize.py文件定義了多個(gè)類,示范了一些常用技巧。

Super:定義一個(gè)method函數(shù)以及在子類中期待一個(gè)動(dòng)作的delegate。
Inheritor:沒有提供任何新的變量名,因此會(huì)獲得Super中定義的一切內(nèi)容。
Replacer:用自己的版本覆蓋Super的method
Extender:覆蓋并回調(diào)默認(rèn)method,從而定制Super的method
Provider:實(shí)現(xiàn)Super的delegate方法預(yù)期的action方法。

下面是這個(gè)文件:

class Super:
  def method(self):
    print('in Super.methon')
  def delegate(self):
    self.action()
class Inheritor(Super):
  pass
class Replacer(Super):
  def method(self):
    print('in Replacer.method')
class Extender(Super):
  def method(self):
    print('starting Extender.method')
    Super.method(self)
    print('ending Extender.method')
class Provider(Super):
  def action(self):
    print('in Provider.action')
if __name__=='__main__':
  for klass in (Inheritor,Replacer,Extender):
    print('\n'+klass.__name__+'...')
    klass().method()
  print('\nProvider...')
  x = Provider()
  x.delegate()

執(zhí)行結(jié)果如下:

Inheritor...
in Super.methon
Replacer...
in Replacer.method
Extender...
starting Extender.method
in Super.methon
ending Extender.method
Provider...
in Provider.action

抽象超類

注意上例中的Provider類是如何工作的。當(dāng)通過Provider實(shí)例調(diào)用delegate方法時(shí),有兩個(gè)獨(dú)立的繼承搜索會(huì)發(fā)生:

1.在最初的x.delegate的調(diào)用中,Python會(huì)搜索Provider實(shí)例和它上層的對(duì)象,直到在Super中找到delegate的方法。實(shí)例x會(huì)像往常一樣傳遞給這個(gè)方法的self參數(shù)。

2.在Super.delegate方法中,self.action會(huì)對(duì)self以及它上層的對(duì)象啟動(dòng)新的獨(dú)立繼承搜索。因?yàn)閟elf指的是Provider實(shí)例,在Provider子類中就會(huì)找到action方法。

這種“填空式”的代碼結(jié)構(gòu)一般就是OOP的軟件框架。這個(gè)例子中的超類有時(shí)也稱作是抽象超類——也就是類的部分行為默認(rèn)是由其子類所提供的。如果預(yù)期的方法沒有在子類中定義,當(dāng)繼承搜索失敗時(shí),Python會(huì)引發(fā)未定義變量名的異常。

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 詳解Python中最難理解的點(diǎn)-裝飾器

    詳解Python中最難理解的點(diǎn)-裝飾器

    記得我好幾年前剛學(xué)Python的時(shí)候,看裝飾器就覺得看九陰真經(jīng)里面的怪文字,完全看不懂,確實(shí)裝飾器是一個(gè)非常難以理解的概念,相信很多初學(xué)者一定也有這樣的困惑,所以篇文章主要介紹了關(guān)于Python中裝飾器的相關(guān)資料,需要的朋友可以參考下。
    2017-04-04
  • Python 利用OpenCV給照片換底色的示例代碼

    Python 利用OpenCV給照片換底色的示例代碼

    這篇文章主要介紹了Python 利用OpenCV給照片換底色,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Python爬蟲中Selenium實(shí)現(xiàn)文件上傳

    Python爬蟲中Selenium實(shí)現(xiàn)文件上傳

    這篇文章主要介紹了Python爬蟲中Selenium實(shí)現(xiàn)文件上傳,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • python 使用cx-freeze打包程序的實(shí)現(xiàn)

    python 使用cx-freeze打包程序的實(shí)現(xiàn)

    這篇文章主要介紹了python 使用cx-freeze打包程序的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-03-03
  • 關(guān)于windows下Tensorflow和pytorch安裝教程

    關(guān)于windows下Tensorflow和pytorch安裝教程

    Tensorflow是廣泛使用的實(shí)現(xiàn)機(jī)器學(xué)習(xí)以及其它涉及大量數(shù)學(xué)運(yùn)算的算法庫(kù)之一。這篇文章主要介紹了Tensorflow和pytorch安裝(windows安裝),需要的朋友可以參考下
    2020-02-02
  • python 簡(jiǎn)單的股票基金爬蟲

    python 簡(jiǎn)單的股票基金爬蟲

    最近基金非?;鸨?,很多原本不投資、不理財(cái)人,也開始討論、參與買基金了。根據(jù)投資對(duì)象的不同,基金分為股票型基金、債券基金、混合型基金、貨幣基金。所以今天我們就來(lái)看看,這些基金公司都喜歡買那些公司的股票。
    2021-06-06
  • Python實(shí)現(xiàn)自動(dòng)上京東搶手機(jī)

    Python實(shí)現(xiàn)自動(dòng)上京東搶手機(jī)

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)自動(dòng)上京東搶手機(jī)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Python 解決火狐瀏覽器不彈出下載框直接下載的問題

    Python 解決火狐瀏覽器不彈出下載框直接下載的問題

    這篇文章主要介紹了Python 解決火狐瀏覽器不彈出下載框直接下載的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-03-03
  • python連接kafka加載數(shù)據(jù)的項(xiàng)目實(shí)踐

    python連接kafka加載數(shù)據(jù)的項(xiàng)目實(shí)踐

    本文主要介紹了python連接kafka加載數(shù)據(jù)的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 解決Python中定時(shí)任務(wù)線程無(wú)法自動(dòng)退出的問題

    解決Python中定時(shí)任務(wù)線程無(wú)法自動(dòng)退出的問題

    今天小編就為大家分享一篇解決Python中定時(shí)任務(wù)線程無(wú)法自動(dòng)退出的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2019-02-02

最新評(píng)論

扬中市| 沙洋县| 芜湖县| 错那县| 秀山| 沿河| 普安县| 仁怀市| 江门市| 政和县| 昌图县| 博湖县| 宾阳县| 绩溪县| 肃北| 桂阳县| 林口县| 晋城| 安龙县| 建阳市| 弥勒县| 淅川县| 米泉市| 东山县| 元阳县| 包头市| 临湘市| 娱乐| 临洮县| 陕西省| 德令哈市| 阳江市| 彭水| 章丘市| 黄平县| 通榆县| 仁怀市| 永靖县| 二手房| 根河市| 定南县|