(七)Python 面向?qū)ο蟮某绦蛟O(shè)計(jì)(類)

  • 1、面向?qū)ο蟮母拍?/strong>

    • 常用的編程方式有兩種:面向過程面向?qū)ο?/strong>屉凯。

    • 面向過程:是早期程序員所使用的方法,首先將問題分解成步驟眼溶,然后用函數(shù)逐個(gè)按次序?qū)崿F(xiàn)悠砚,運(yùn)行的時(shí)候依次調(diào)用即可。

    • 面向?qū)ο?/strong>:是指把構(gòu)成問題的事務(wù)分解組合抽象成對(duì)象堂飞,建立對(duì)象的目的不是為了完成其中某個(gè)步驟灌旧,而是為了描述某個(gè)事務(wù)在解決整個(gè)問題中的行為,可能涉及一個(gè)步驟绰筛,但通常都會(huì)涉及多個(gè)步驟枢泰,很好地體現(xiàn)了軟件重用的思想。Python 在涉及之初就是一門面向?qū)ο蟮恼Z言铝噩。

    • 看幾個(gè)概念

      • 類(class):對(duì)具有相同屬性和方法的一組對(duì)象的描述或定義衡蚂。
      • 對(duì)象(object):類的實(shí)例。
      • 實(shí)例(Inatance):其含義與對(duì)象基本一致骏庸。創(chuàng)建一個(gè)新對(duì)象的過程稱為實(shí)例化(Instantiation),這個(gè)新對(duì)象稱為這個(gè)類的一個(gè)實(shí)例毛甲。
      • 標(biāo)識(shí)(Identity): 每個(gè)實(shí)例對(duì)象的唯一標(biāo)識(shí)。
      • 實(shí)例屬性(Inatance Attribute): 特定對(duì)象所具有的一組屬性的集合具被。
      • 實(shí)例方法(Inatance Method): 對(duì)于特定對(duì)象實(shí)例的一條或多條屬性的操作函數(shù)集合丽啡。
      • 類屬性(Class Attribute): 屬于一個(gè)類中所有對(duì)象的屬性,不會(huì)只在某個(gè)實(shí)例上發(fā)生變化硬猫。
      • 類方法(Class Method):那些無須指定實(shí)例就能夠工作的從屬于類的函數(shù)补箍。
  • 2改执、類與實(shí)例

    • 創(chuàng)建類和子類:類使用class關(guān)鍵字創(chuàng)建,類的屬性和方法被列在一個(gè)縮進(jìn)塊中坑雅。如下:

       #  類
       class animals:
               pass
       # 子類
       class mammals(animals):
               pass
      
    • 用函數(shù)表示類的行為特征:為類和子類創(chuàng)建行為特征---函數(shù)辈挂,如下:

      class animals:
           def breth(self):
               print("呼吸")
      class mammals(animals):
           def move(self):
               print("奔跑")
      class dog(mammals):
           def eat(self):
               print("吃")
      Bob = dog()
      Bob.move()
      Bob.eat()
      運(yùn)行結(jié)果:
      奔跑
      吃
      
  • 3、面向?qū)ο蟮奶卣?/strong>

    • Python程序是面向?qū)ο蟮某绦?/strong>裹粤,具有三個(gè)特征:封裝终蒂、繼承和多態(tài)

    • 封裝是指將對(duì)象得到的數(shù)據(jù)和行為結(jié)合遥诉,將基本類結(jié)構(gòu)的細(xì)節(jié)隱藏起來拇泣,通過方法接口實(shí)現(xiàn)對(duì)實(shí)例變量的所有訪問。Python中允許對(duì)類的數(shù)據(jù)和方法進(jìn)行封裝矮锈,下面的例子封裝了類中的數(shù)據(jù)霉翔,將公司名和領(lǐng)導(dǎo)人分別封裝到對(duì)象objc1和objc2中的self的 companyname 和 leader屬性中。

      class Company:
           def __init__(self,companyname,leader):
                 self. companyname = companyname
                 self. leader = leader
      if __name__ == "__main__":
           objc1 = Company("a","Nike")
           objc1 = Company("b","Jack")
      

      在調(diào)用數(shù)據(jù)時(shí)苞笨,可以使用兩種方式:通過對(duì)象直接調(diào)用和通過self直接調(diào)用债朵。例如:

      class Company:
          def __init__(self, companyname, leader):
                self.companyname = companyname
                self.leader = leader
          def show(self):
                print(self.companyname)
                print(self.leader)
      
      if __name__ == "__main__":
          objc1 = Company("a", "Nike")
          objc2 = Company("b", "Jack")
      
      # 通過對(duì)象直接調(diào)用封裝的數(shù)據(jù)
      print(objc1.companyname)
      print(objc1.leader)
      運(yùn)行結(jié)果為:
      a
      Nike
      
      # 通過self來間接調(diào)用,self即對(duì)象本身
      objc1.show()
      objc2.show()
      運(yùn)行結(jié)果為:
      a
      Nike
      b
      Jack
      
    • 繼承:當(dāng)已經(jīng)存在一個(gè)類瀑凝,需要另外再創(chuàng)建一個(gè)和已有類型非常相似的類時(shí)序芦,通常不必將同一段代碼重復(fù)多次,而是用繼承粤咪。在類上添加關(guān)聯(lián)谚中,使得位于不同層次的類可以“繼承”位于關(guān)系上層的類的屬性。繼承有利于代碼的復(fù)用和模塊化寥枝。和其他語言不同的是藏杖,Python 中的類還具有多繼承的特性。即一個(gè)類可以有多個(gè)父類脉顿。

      • 繼承一個(gè)父類: 下面這個(gè)例子中蝌麸,Company類 只有Scale 一個(gè)父類。當(dāng)調(diào)用 check()方法時(shí)艾疟,Company 本身沒有定義check()方法来吩,代碼就會(huì)向上自動(dòng)檢測(cè)父類Scale中是否存在check()方法,結(jié)果父類中找到了該方法蔽莱,次為單繼承弟疆,即只有一個(gè)父類。

        class Scale:
            def check(self):
                 if self.count_person > 500:
                      print("%s是個(gè)大公司." % self.name)
                 else:
                      print("%s是個(gè)小公司." % self.name)
        class Company(Scale):
            def __init__(self,name,count):
                 self.name = name
                 self.count_person = count
        
        if __name__ == "__main__":
           my_company = Company("JK",600)
           my_company.check()
        
      • 繼承多個(gè)父類:

        class Scale:
             def check(self):
                  if self.count_person > 500:
                       return "%s是個(gè)大公司." % self.name
                  else:
                       return "%s是個(gè)小公司." % self.name
        class Detail:
             def show(self,scale):
                 print("%s,公司有%s名員工."%(scale,self.count_person))
        
        class Company(Scale,Detail):
            def __init__(self,name,count):
                 self.name = name
                 self.count_person = count
        
        if __name__ == "__main__":
             my_company = Company("JK",600)
             company_scale = my_company.check()
             my_company.show(company_scale)
        結(jié)果為:
        JK是個(gè)大公司.,公司有600名員工.
        

        在上面的例子中盗冷,類Company 分別繼承了類Scale和類Detail,可以調(diào)用父類中的check和show方法怠苔,這種繼承的方法稱為多繼承

    • 多態(tài): 多態(tài)即多種姿態(tài)仪糖,是指在事先不知道對(duì)象類型的情況下柑司,可以自動(dòng)根據(jù)對(duì)象的不同類型迫肖,執(zhí)行響應(yīng)的操作。很多內(nèi)建運(yùn)算符以及函數(shù)攒驰、方法都能體現(xiàn)多態(tài)的性質(zhì)蟆湖。例如:“+”運(yùn)算符,在連接數(shù)值類型變量時(shí)表示加法操作玻粪,在連接字符串時(shí)則表示拼接隅津。例如:函數(shù)的多態(tài)性舉例

      >>> def length(x):
               print(repr(x),"的長(zhǎng)度為",len(x))
      >>> print(length('aaa'))
      'aaa' 的長(zhǎng)度為 3
      >>> print(length([1,2,4,5,6]))
      [1, 2, 4, 5, 6] 的長(zhǎng)度為 5
      

      函數(shù) repr() 返回一個(gè)對(duì)象的可打印字符串,無須事先知道是什么類型劲室,該函數(shù)也表現(xiàn)了Python多態(tài)特性伦仍。

  • 4、庫的安裝

    • 4.1很洋、包的管理: Python 程序一般由 包(package)充蓝、模塊(module)函數(shù)(function)三部分組成。其中 是一系列模塊組成的集合蹲缠,模塊是處理某類問題的函數(shù)和類的集合。一個(gè)包可以包含多個(gè)模塊悠垛,每個(gè)模塊可以包含多個(gè)函數(shù)與類线定,同時(shí)也可以有執(zhí)行語句,每個(gè)包其實(shí)就是完成特定任務(wù)的工具箱确买。具體來說斤讥,一個(gè).py文件可以被看做是一個(gè)獨(dú)立的模塊,一個(gè)模塊通常就是一個(gè)文件湾趾,因?yàn)槟K是按照邏輯組織代碼的方法芭商,而文件是物理層存儲(chǔ)模塊的方式。包是一個(gè)可以完整測(cè)試的搀缠、獨(dú)立開發(fā)的模塊組合铛楣,通常發(fā)布在Python 指定的文件夾里。當(dāng)多個(gè)模塊使用同一組模塊時(shí)艺普,可以將模塊封裝成包簸州,發(fā)布到公共文件里,這就是包的含義歧譬。所以說模塊對(duì)應(yīng)的物理層結(jié)構(gòu)是文件岸浑,那么包對(duì)應(yīng)的物理層結(jié)構(gòu)就是文件夾。包是通過目錄結(jié)構(gòu)組織的模塊的集合瑰步,使用包的方式跟模塊類似矢洲,可以通過import導(dǎo)入,需要注意的是缩焦,當(dāng)文件夾當(dāng)做包使用時(shí)读虏,文件夾中需要包含一個(gè)_init_.py 文件责静,主要為了避免將包當(dāng)做普通的文件夾。_init_.py的內(nèi)容可以為空掘譬。

    • 4.2泰演、包管理工具: 有4種,關(guān)系如下:

      Python包管理

      • distutils: 是 Python 標(biāo)準(zhǔn)庫的一部分葱轩,為開發(fā)者提供一種方便的打開方式睦焕,同時(shí)也為使用者提供了方便的包安裝方式。
      • setuptools: 是對(duì)distutils 的增強(qiáng)靴拱,引入了包依賴管理垃喊。setuptools可以為Python 包創(chuàng)建egg文件。Python 與 egg文件的關(guān)系袜炕,類似于Java語言與 jar包的關(guān)系本谜。setuptools提供的easy_install 腳本可以用來安裝 egg 包。
      • easy_install:是由 PEAK (Python Enterprise Application Kit) 開發(fā)的setuptools包里帶的一個(gè)命令偎窘,所以使用easy_install實(shí)際上是在調(diào)用 setuptools 來完成模塊的工作乌助。easy_install可以自動(dòng)從 https://pypi.python.org/pypi 下載相關(guān)的包,并完成安裝和升級(jí)陌知。
      • pip:是安裝管理Python 包的標(biāo)準(zhǔn)工具他托,是對(duì)easy_install增強(qiáng)和替代,但它仍有大量的功能建立在setuptools組件之上仆葡。同樣可以從 PyPI網(wǎng)站自動(dòng)下載安裝包赏参。在pip中,安裝所需要的包都需要先下載沿盅,并且所有的安裝包都會(huì)被跟蹤把篓,因此避免了出現(xiàn)安裝不完整的情況。
    • 4.3腰涧、包格式:用于Python 第三方庫安裝的包格式有以下兩種

      • egg: 格式是 setuptools 引入的一種文件格式韧掩,使用.egg作為擴(kuò)展名,用setuptools識(shí)別窖铡、解析和安裝揍很。
      • wheel:本質(zhì)上是 ZIP的壓縮格式,使用 .whl 作為擴(kuò)展名万伤。
    • 4.4窒悔、安裝方式: 百度自己搜

  • 5、模塊的引用
    應(yīng)用Python 進(jìn)行編程時(shí)敌买,通常會(huì)使用一些庫(模塊) 來滿足開發(fā)需求简珠。Python 中庫主要分為三大類: 第一類是標(biāo)準(zhǔn)模塊,第二類是第三方模塊,第三類是自定義模塊聋庵。無論哪個(gè)庫使用之前都需要導(dǎo)入膘融。這里一個(gè)庫可能包含多個(gè)模塊,但其含義均指 module祭玉。

    • 5.1氧映、使用 import 方式導(dǎo)入庫
      使用 import 語句導(dǎo)入模塊,語法如下:

      import <模塊 1>
      import <模塊 2>
      

      也可以在一行內(nèi)導(dǎo)入多個(gè)模塊(可讀性差脱货,不推薦)
      只要導(dǎo)入了某個(gè)模塊岛都,就可以引用它的所有公共函數(shù)、類或者屬性振峻。如果 import語句是在代碼的頂層臼疫,則它的作用域?yàn)槿郑蝗绻鹖mport語句在某個(gè)函數(shù)中扣孟,則它的作用域僅局限于該函數(shù)烫堤。
      用import模塊語句導(dǎo)入模塊,就在當(dāng)前的名稱空間(NameSpace) 中建立一個(gè)指向該模塊的引用凤价,這種引用必須使用全稱鸽斟。也就是說,當(dāng)使用被導(dǎo)入的模塊的函數(shù)時(shí)利诺,在調(diào)用時(shí)必須同時(shí)包含模塊的名字富蓄,不能只使用函數(shù)名字,而應(yīng)該使用“模塊名.函數(shù)名”,例如導(dǎo)入 繪圖模塊 turtle

      >>> import turtle
      >>> t= turtle.Pen()
      

      若引入的模塊名稱較長(zhǎng)立轧,為方便使用格粪,通初锏酰可用 as 定義一個(gè)別名氛改。例如,導(dǎo)入 Matplotlib庫 pyplot 模塊:import Matplotlib as plt ,然后就可以直接用 plt.figure(....) 創(chuàng)建繪圖對(duì)象比伏,二不必使用 Matplotlib.pyplot.figure(...)胜卤。

    • 5.2、from 方式

      將模塊中指定的屬性或名稱導(dǎo)入當(dāng)前程序命名空間赁项,語法格式如下:

      from <模塊名> import <函數(shù)名>
      

      例如葛躏,導(dǎo)入畫圖模塊 turtle 中的 Pen()函數(shù):

      >>> from  turtle import Pen
      >>> t = Pen()
      
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末快骗,一起剝皮案震驚了整個(gè)濱河市郭毕,隨后出現(xiàn)的幾起案子赔癌,更是在濱河造成了極大的恐慌锥咸,老刑警劉巖汁掠,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件论寨,死亡現(xiàn)場(chǎng)離奇詭異卤恳,居然都是意外死亡萄喳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門猾愿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹦聪,“玉大人,你說我怎么就攤上這事蒂秘≡蟊荆” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵姻僧,是天一觀的道長(zhǎng)规丽。 經(jīng)常有香客問我,道長(zhǎng)段化,這世上最難降的妖魔是什么嘁捷? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮显熏,結(jié)果婚禮上雄嚣,老公的妹妹穿的比我還像新娘。我一直安慰自己喘蟆,他們只是感情好缓升,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蕴轨,像睡著了一般港谊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上橙弱,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天歧寺,我揣著相機(jī)與錄音,去河邊找鬼棘脐。 笑死斜筐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛀缝。 我是一名探鬼主播顷链,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼屈梁!你這毒婦竟也來了嗤练?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤在讶,失蹤者是張志新(化名)和其女友劉穎煞抬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體构哺,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡革答,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝗碎。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡湖笨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹦骑,到底是詐尸還是另有隱情慈省,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布眠菇,位于F島的核電站边败,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏捎废。R本人自食惡果不足惜笑窜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望登疗。 院中可真熱鬧排截,春花似錦、人聲如沸辐益。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽智政。三九已至认罩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間续捂,已是汗流浹背垦垂。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牙瓢,地道東北人劫拗。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像一罩,于是被迫代替她去往敵國(guó)和親杨幼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撇簿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容