欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python的面向?qū)ο缶幊谭绞綄W(xué)習(xí)筆記

 更新時(shí)間:2024年09月20日 17:27:23   作者:Sheldon  
Python深度具備面向?qū)ο缶幊陶Z(yǔ)言所應(yīng)有的特性,這里我們以類和方法為主,來整理一下Python的面向?qū)ο缶幊谭绞綄W(xué)習(xí)筆記:

類與實(shí)例
類與實(shí)例相互關(guān)聯(lián)著:類是對(duì)象的定義,而實(shí)例是“真正的實(shí)物”,它存放了類中所定義的對(duì)象的具體信息。

下面的示例展示了如何創(chuàng)建一個(gè)類:

class MyNewObjectType(bases):
   ''' 創(chuàng)建 MyNewObjectType 類'''
   class_suite

關(guān)鍵字是 class,緊接著一個(gè)類名。隨后是定義類的類代碼。這里通常由各種各樣的定義和聲明組成。新式類和經(jīng)典類聲明的最大不同在于,所有新式類必須繼承至少一個(gè)父類,參數(shù) bases 可以是一個(gè)(單繼承)或多個(gè)(多重繼承)用于繼承的父類。

創(chuàng)建一個(gè)實(shí)例的過程稱作實(shí)例化,過程如下(注意:沒有使用 new 關(guān)鍵字):

myFirstObject = MyNewObjectType()

類名使用我們所熟悉的函數(shù)操作符(()),以“函數(shù)調(diào)用”的形式出現(xiàn)。然后你通常會(huì)把這個(gè)新建的實(shí)例賦給一個(gè)變量。賦值在語(yǔ)法上不是必須的,但如果你沒有把這個(gè)實(shí)例保存到一個(gè)變量中,它就沒用了,會(huì)被自動(dòng)垃圾收集器回收,因?yàn)槿魏我弥赶蜻@個(gè)實(shí)例。這樣,你剛剛所做的一切,就是為那個(gè)實(shí)例分配了一塊內(nèi)存,隨即又釋放了它。

類既可以很簡(jiǎn)單,也可以很復(fù)雜,這全憑你的需要。最簡(jiǎn)單的情況,類僅用作名稱空間(namespace)。這意味著你把數(shù)據(jù)保存在變量中,對(duì)他們按名稱空間進(jìn)行分組,使得他們處于同樣的關(guān)系空間中——所謂的關(guān)系是使用標(biāo)準(zhǔn) Python 句點(diǎn)屬性標(biāo)識(shí)。例如,你有一個(gè)本身沒有任何屬性的類,使用它僅對(duì)數(shù)據(jù)提供一個(gè)名字空間,讓你的類擁有像 C 語(yǔ)言中的結(jié)構(gòu)體(structure)一樣的特性,或者換句話說,這樣的類僅作為容器對(duì)象來共享名字空間。

示例如下:

class MyData(object):
  pass

mathObj = MyData()
mathObj.x = 4
mathObj.y = 5
mathObj.x + mathObj.y
9
mathObj.x \\* mathObj.y
20

方法
在 Python 中,方法定義在類定義中,但只能被實(shí)例所調(diào)用。也就是說,調(diào)用一個(gè)方法的最終途徑必須是這樣的:(1)定義類(和方法);(2)創(chuàng)建一個(gè)實(shí)例;(3)最后一步,用這個(gè)實(shí)例調(diào)用方法。例如:

class MyDataWithMethod(object): # 定義類
  def printFoo(self): # 定義方法
    print 'You invoked printFoo()!'

這里的 self 參數(shù),它在所有的方法聲明中都存在。這個(gè)參數(shù)代表實(shí)例對(duì)象本身,當(dāng)你用實(shí)例調(diào)用方法時(shí),由解釋器傳遞給方法的,所以,你不需要自己傳遞 self 進(jìn)來,因?yàn)樗亲詣?dòng)傳入的。

舉例說明一下,假如你有一個(gè)帶兩參數(shù)的方法,所有你的調(diào)用只需要傳遞第二個(gè)參數(shù)。

下面是實(shí)例化這個(gè)類,并調(diào)用那個(gè)方法:

> > > myObj = MyDataWithMethod()
> > > myObj.printFoo()
You invoked printFoo()!

\\_init\\(),是一個(gè)特殊的方法。在 Python 中, \\init\\() 實(shí)際上不是一個(gè)構(gòu)造器。你沒有調(diào)用“new”來創(chuàng)建一個(gè)新對(duì)象。(Python 根本就沒有“new”這個(gè)關(guān)鍵字)。取而代之, Python 創(chuàng)建實(shí)例后,在實(shí)例化過程中,調(diào)用 \\init\\_()方法,當(dāng)一個(gè)類被實(shí)例化時(shí),就可以定義額外的行為,比如,設(shè)定初始值或者運(yùn)行一些初步診斷代碼——主要是在實(shí)例被創(chuàng)建后,實(shí)例化調(diào)用返回這個(gè)實(shí)例之前,去執(zhí)行某些特定的任務(wù)或設(shè)置。

創(chuàng)建一個(gè)類(類定義)

class AddrBookEntry(object):
  '''address book entry class'''
  def __init__(self, nm, ph): # 定義構(gòu)造器
    self.name = nm       # 設(shè)置 name
    self.phone = ph       # 設(shè)置 phone
    print 'Created instance for:', self.name

  def updatePhone(self, newph):  # 定義方法
    self.phone = newph
    print 'Updated phone# for: ', self.name

在 AddrBookEntry 類的定義中,定義了兩個(gè)方法: \\_init\\()和updatePhone()。\\init\\()在實(shí)例化時(shí)被調(diào)用,即,在AddrBookEntry()被調(diào)用時(shí)。你可以認(rèn)為實(shí)例化是對(duì) \\init\\()的一種隱式的調(diào)用,因?yàn)閭鹘oAddrBookEntry()的參數(shù)完全與\\init\\_()接收到的參數(shù)是一樣的(除了self,它是自動(dòng)傳遞的)。

創(chuàng)建實(shí)例(實(shí)例化)

> > > john = AddrBookEntry('John Doe', '408-555-1212') # 為 John Doe 創(chuàng)建實(shí)例
> > > jane = AddrBookEntry('Jane Doe', '650-555-1212') # 為 Jane Doe 創(chuàng)建實(shí)例

這就是實(shí)例化調(diào)用,它會(huì)自動(dòng)調(diào)用 \\_init\\()。 self 把實(shí)例對(duì)象自動(dòng)傳入\\init\\_()。

另外,如果不存在默認(rèn)的參數(shù),那么傳給 \\_init\\_() 的兩個(gè)參數(shù)在實(shí)例化時(shí)是必須的。

訪問實(shí)例屬性

> > > john
> > > john.name
> > > jane.name
> > > jane.phone

一旦實(shí)例被創(chuàng)建后,就可以證實(shí)一下,在實(shí)例化過程中,我們的實(shí)例屬性是否確實(shí)被 \\_init\\_() 設(shè)置了。我們可以通過解釋器“轉(zhuǎn)儲(chǔ)”實(shí)例來查看它是什么類型的對(duì)象。

方法調(diào)用(通過實(shí)例)

> > > john.updatePhone('415-555-1212')  # 更新 John Doe 的電話
> > > john.phone

updatePhone()方法需要一個(gè)參數(shù)(不計(jì) self 在內(nèi)):新的電話號(hào)碼。在 updatePhone()之后,立即檢查實(shí)例屬性,可以證實(shí)已生效。

方法與屬性的小結(jié)
直接上代碼,已經(jīng)在里面有注釋了

#coding:utf8

name = 'yangyanxing'
class Test():
  class kevin():
    var1 = '我是內(nèi)部類'

  name = 'kvein'
  gae = '26'

  def fun1(self):
    print self.name
    print '我是公共方法'
    self.__fun2() #可以通過公有就去來調(diào)用私有方法,在調(diào)用的過程中可以進(jìn)行更改

  def __fun2(self):
    print '我是私有方法'

  @classmethod
  def fun3(self): #可以不通過實(shí)例來訪問這個(gè)類方法
    print '#'*40
    print self.name
    print '我是類方法'

  @staticmethod #靜態(tài)方法,也是可以不通過實(shí)例對(duì)象就可以訪問的方法但是在定義的時(shí)候不用加self
  def fun4():
    print Test.name
    print name #這里的name是全局變量
    Test.fun3()
    print '我是靜態(tài)方法'

print Test.name #公有屬性可以直接方法,不用實(shí)例化對(duì)象
yang = Test() #實(shí)例化一個(gè)類
interyang = Test.kevin() #實(shí)例化一個(gè)內(nèi)部類
yang.fun1() #方法類里面的公共屬性
print interyang.var1 # 訪問內(nèi)部類里的屬性
Test.fun3()#訪問類方法
Test.fun4()
#coding:utf8

class Test():
  var1 = '類的公有屬性'
  __var2 = '類的私有屬性'

  def fun(self):
    self.var2 = '對(duì)象的公有屬性' # 這里定義了一個(gè)對(duì)象的公有屬性
    self.__var3 = '對(duì)象的私有屬性'# 這里定義了一個(gè)對(duì)象的私有屬性
    var4 = '函數(shù)的局部變量' #這里定義了一個(gè)函數(shù)的局部變量,這里面的var4只有在函數(shù)內(nèi)部使用

kevin = Test() #實(shí)例了一個(gè)對(duì)象
yang = Test() #又實(shí)例了另外一個(gè)對(duì)象
print kevin.var1
##print kevin.__var2 #這里將無法訪問
kevin.fun()
print kevin.var2 #在沒有調(diào)用fun函數(shù)之前是沒有var2的
##print kevin.__var3 對(duì)象的私有屬性是無法調(diào)用的
##print yang.var2 #這里因?yàn)闆]有調(diào)用yang的fun方法,所以還是無法訪問yang里的var2


創(chuàng)建子類
靠繼承來進(jìn)行子類化是創(chuàng)建和定制新類型的一種方式,新的類將保持已存在類所有的特性,而不會(huì)改動(dòng)原來類的定義。對(duì)于新類類型而言,這個(gè)新的子類可以定制只屬于它的特定功能。除了與父類或基類的關(guān)系外,子類與通常的類沒有什么區(qū)別,也像一般類一樣進(jìn)行實(shí)例化。注意下面,子類聲明中提到了父類:

class EmplAddrBookEntry(AddrBookEntry):
  '''Employee Address Book Entry class''' # 員工地址簿類
  def __init__(self, nm, ph, id, em):
    AddrBookEntry.__init__(self, nm, ph)
    self.empid = id
    self.email = em

  def updateEmail(self, newem):
    self.email = newem
    print 'Updated e-mail address for:', self.name

現(xiàn)在我們創(chuàng)建了第一個(gè)子類, EmplAddrBookEntry。 Python 中,當(dāng)一個(gè)類被派生出來,子類就繼承了基類的屬性,所以,在上面的類中,我們不僅定義了 \\_init\\_(),UpdateEmail()方法,而且 EmplAddrBookEntry 還從 AddrBookEntry 中繼承了 updatePhone()方法。

如果需要,每個(gè)子類最好定義它自己的構(gòu)造器,不然,基類的構(gòu)造器會(huì)被調(diào)用。然而,如果子類重寫基類的構(gòu)造器,基類的構(gòu)造器就不會(huì)被自動(dòng)調(diào)用了——這樣,基類的構(gòu)造器就必須顯式寫出才會(huì)被執(zhí)行,就像我們上面那樣,用AddrBookEntry.\\_init\\_()設(shè)置名字和電話號(hào)碼。我們的子類在構(gòu)造器后面幾行還設(shè)置了另外兩個(gè)實(shí)例屬性:?jiǎn)T工ID和電子郵件地址。

注意,這里我們要顯式傳遞 self 實(shí)例對(duì)象給基類構(gòu)造器,因?yàn)槲覀儾皇窃谠搶?shí)例中而是在一個(gè)子類實(shí)例中調(diào)用那個(gè)方法。因?yàn)槲覀儾皇峭ㄟ^實(shí)例來調(diào)用它,這種未綁定的方法調(diào)用需要傳遞一個(gè)適當(dāng)?shù)膶?shí)例(self)給方法。

使用子類

> > > john = EmplAddrBookEntry('John Doe', '408-555-1212', 42, 'john@spam.doe')
> > > john
> > > john.name
> > > john.phone
> > > john.email
> > > john.updatePhone('415-555-1212')
> > > john.phone
> > > john.updateEmail('john@doe.spam')
> > > john.email

相關(guān)文章

  • Python使用jpype的踩坑記錄

    Python使用jpype的踩坑記錄

    Pype是一個(gè)能夠讓 python 代碼方便地調(diào)用 Java 代碼的工具,這篇文章主要來和大家分享一下Python使用jpype會(huì)踩的一些坑,希望對(duì)大家有所幫助
    2023-06-06
  • 解決Keras 與 Tensorflow 版本之間的兼容性問題

    解決Keras 與 Tensorflow 版本之間的兼容性問題

    今天小編就為大家分享一篇解決Keras 與 Tensorflow 版本之間的兼容性問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Django框架請(qǐng)求生命周期實(shí)現(xiàn)原理

    Django框架請(qǐng)求生命周期實(shí)現(xiàn)原理

    這篇文章主要介紹了Django框架請(qǐng)求生命周期實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Python的Lambda函數(shù)用法詳解

    Python的Lambda函數(shù)用法詳解

    在Python中有兩種函數(shù),一種是def定義的函數(shù),另一種是lambda函數(shù),也就是大家常說的匿名函數(shù)。這篇文章主要介紹了Python的Lambda函數(shù)用法,需要的朋友可以參考下
    2019-09-09
  • 在pycharm 中添加運(yùn)行參數(shù)的操作方法

    在pycharm 中添加運(yùn)行參數(shù)的操作方法

    今天小編就為大家分享一篇在pycharm 中添加運(yùn)行參數(shù)的操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python線程編程之Thread詳解

    Python線程編程之Thread詳解

    這篇文章主要為大家介紹了Python線程編程之Thread,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Python與Appium實(shí)現(xiàn)手機(jī)APP自動(dòng)化測(cè)試的示例代碼

    Python與Appium實(shí)現(xiàn)手機(jī)APP自動(dòng)化測(cè)試的示例代碼

    本文主要介紹了Python與Appium實(shí)現(xiàn)手機(jī)APP自動(dòng)化測(cè)試的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Python的collections模塊中的OrderedDict有序字典

    Python的collections模塊中的OrderedDict有序字典

    字典是無序的,但是collections的OrderedDict類為我們提供了一個(gè)有序的字典結(jié)構(gòu),名副其實(shí)的Ordered+Dict,下面通過兩個(gè)例子來簡(jiǎn)單了解下Python的collections模塊中的OrderedDict有序字典:
    2016-07-07
  • Python GUI編程之tkinter 關(guān)于 ttkbootstrap 的使用詳解

    Python GUI編程之tkinter 關(guān)于 ttkbootstrap 的使用

    ttkbootstrap 是一個(gè)基于 tkinter 的界面美化庫(kù),使用這個(gè)工具可以開發(fā)出類似前端 bootstrap 風(fēng)格的 tkinter 桌面程序,這篇文章主要介紹了Python GUI編程之tkinter 關(guān)于 ttkbootstrap 的使用詳解,需要的朋友可以參考下
    2022-03-03
  • python的ImageTk.PhotoImage大坑及解決

    python的ImageTk.PhotoImage大坑及解決

    這篇文章主要介紹了python的ImageTk.PhotoImage大坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評(píng)論