Python--類和對象學習

一是趴、面向?qū)ο缶幊谈攀?/h2>

1敷燎、面向?qū)ο缶幊蹋∣OP)

  • 面向?qū)ο螅?strong>以具體的事物(對象)為單位暂筝,考慮它的屬性(特征)及動作(行為),關(guān)注整體硬贯。java焕襟、c#也是面向?qū)ο缶幊獭?/p>

  • 例子解讀(把大象裝進冰箱):為了把大象裝進冰箱,需要做三個動作(行為)。每個動作有一個執(zhí)行者坏晦,它就是對象赌朋,這里對象是冰箱。

    1. 冰箱卫漫,你給我把門打開(冰箱.開門())
    2. 冰箱,你給我把大象裝進去(冰箱.裝大象())
    3. 冰箱肾砂,你給我把門關(guān)上(冰箱.關(guān)門())
      依次做這些動作列赎,就能把大象裝進冰箱。
  • 三大特征

    (1)封裝(信息隱蔽技術(shù)):類的封裝镐确、函數(shù)封裝包吝,方便調(diào)用。

    #創(chuàng)建一個list1列表對象源葫,我們不需知道列表對象里方法的具體實現(xiàn)過程诗越,封裝好了,用方法名直接調(diào)用即可
    >>>list1 = [1,5,2,6]
    >>>list1.append(10)
    >>>list1
    [1,5,2,6,10]
    >>>list1.sort()
    [1,2,5,6,10]
    

    (2)繼承:子類繼承父類的方法和屬性

    #創(chuàng)建一個Mylist類息堂,繼承l(wèi)ist類的屬性和方法
    class Mylist(list):
      pass
    
    >>>list2 = Mylist()
    >>>list2.append(4)
    >>>list2.append(5)
    >>>list2.append(6)
    >>>list2
    [4,5,6] 
    

    類名后面緊接著是(object)嚷狞,表示該類是從哪個類繼承下來的块促。通常,如果沒有合適的繼承類床未,就使用object類竭翠,這是所有類最終都會繼承的類。

    (3)多態(tài):不同對象對同一方法響應不同的行動薇搁,而無需明確知道這個對象是什么斋扰。即一個方法,多種形態(tài)啃洋,就是多態(tài)传货。

    class Person(Object):
      def func(self):
          print('我是人!')
    class Girl(Person):
      def func(self):
          print('我是妹子!')
    class Boy(Person):
      def func(self):
          print('我是漢子!')
    def func1(x): #涉及知識點:靜態(tài)/動態(tài)類型語言,file-like object宏娄,“鴨子類型”(duck typing)
      x.func()
    
    >>>a = Person()
    >>>b = Girl()
    >>>c = Boy()
    >>>a.func1()
    我是人损离!
    >>>b.func1()
    我是妹子!
    >>>c.func1()
    我是漢子绝编!
    

2僻澎、面向過程編程

  • 面向過程:以一個具體的流程為單位,考慮它的實現(xiàn)方法十饥,關(guān)心的是功能的實現(xiàn)(耦合性比較強)窟勃。C語言是面向過程編程。

  • 例子解讀(把大象裝進冰箱):為了把大象裝進冰箱逗堵,需要3個過程秉氧。

    1. 把冰箱門打開(得到打開門的冰箱)
    2. 把大象裝進去(打開門后,得到里面裝著大象的冰箱)
    3. 把冰箱門關(guān)上(打開門蜒秤、裝好大象后汁咏,獲得關(guān)好門的冰箱)
      每個過程有一個階段性的目標,依次完成這些過程作媚,就能把大象裝進冰箱攘滩。

3、類和對象

  • 類是對一組具有相同特性(屬性)和相同行為(方法)的事物的概括纸泡,是抽象的模板漂问;對象是客觀世界實際存在的事物都是一個對象,即“萬物萬事皆對象”女揭。對象=屬性+方法

  • 類是對象的模板蚤假,對象是類的實例

    #定義一個人類Person,類名首字母要大寫
    class Person:
          def __init__(self,name,sex,age):
          self.name=name     #name,sex,age是類的屬性
          self.sex=sex
          self.age=age 
      #定義類的方法
          def introduce(self):
              print('大家好,我叫%s吧兔,%s磷仰,今年%s歲'%(self.name,self.sex,self.age))
          def eat(self):
          print('%s:好餓了,想吃大餐境蔼,畢竟吃飽了灶平,才有力氣減肥伺通,嘻嘻'%self.name)
          def run(self):
          print('%s:運動讓人快樂,跑步走起!'%self.name)
          def sleep(self):
          print('%s:不嗨了民逼,早睡早起身體棒!'%self.name)
    
    #實例化涮帘,創(chuàng)建一個對象
    >>>xiao_ming = Person('李小明','男','24')
    #調(diào)用Person類的方法
    >>>xiao_ming.introduce()
    大家好拼苍,我叫李小明,男调缨,24歲
    >>>xiao_ming.eat()
    李小明:好餓了疮鲫,想吃大餐,畢竟吃飽了弦叶,才有力氣減肥俊犯,嘻嘻
    
  • 拓展

    1、什么是類伤哺、類對象燕侠、實例對象?

     #這是一個類立莉,定義完之后也是一個類對象
     class C:  
         count=0
     -----------------------------------------
     >>>a=C() #a绢彤、b、c是實例對象
     >>>b=C()
     >>>c=C()
     >>>a.count
     0
     >>>b.count
     0
     >>>c.count
     0
     ---------------------------------------
     >>>c.count+=10  #實例對象覆蓋了類對象里的屬性
     >>>c.count
     10
     >>>a.count
     0
     >>>b.count
     0
     ---------------------------------------
     >>>C.count+=100
     >>>C.count
     100
     >>>a.count
     100
     >>>b.count
     100
     >>>c.count
     10
    
    graph TB
    task1("類定義 C")-->task2("類對象 C")
    task2-->task3("實例對象 a")
    task2-->task4("實例對象 b")
    task2-->task5("實例對象 c")
    

二蜓耻、self是什么

  • 類的定義里茫舶,self會出現(xiàn)在函數(shù)的第一個參數(shù)里(python的默認要求,必填參數(shù)刹淌,這是與普通函數(shù)的一個區(qū)別)饶氏,通過哪個對象調(diào)用的方法,則self就是哪個對象

  • 例子解讀:(還是用上述Person類)

    #實例化有勾,創(chuàng)建xiao_ming對象
    >>>xiao_ming = Person('李小明','男','24')
    #通過xiao_ming這個對象來調(diào)用introduce方法
    >>>xiao_ming.introduce()
    大家好疹启,我叫李小明,男蔼卡,今年24歲
    
    #實例化皮仁,創(chuàng)建zhangli對象
    >>>zhangli = Person('張麗','女','18')
    #通過zhangli這個對象來調(diào)用introduce方法
    >>>zhangli.introduce()
    大家好,我叫張麗菲宴,女贷祈,今年18歲
    

    def introduce(self):

    ? print('大家好,我叫%s喝峦,%s势誊,今年%s歲'%(self.name,self.sex,self.age))

    當對象xiao_ming調(diào)用introduce()方法時,self會調(diào)用xiao_ming的name谣蠢,sex粟耻,age屬性作為參數(shù)輸入查近,然后print對應格式輸出自我介紹;而zhangli這個對象調(diào)用introduce()時挤忙,則傳入的是zhangli的name霜威,sex,age册烈。

三戈泼、訪問限制:公有與私有

  • C++中,用public和private標識公有變量與私有變量赏僧,而在python中大猛,默認情況下,對象的屬性淀零、方法都為公有的挽绩,用.點操作符來訪問

    class Car:
          name = '本田' 
    >>>c1 = Car()
    >>>c1.name #用.點操作符來訪問
    '本田'
    >>>c1.name = '豐田' #外部可自由修改c1實例的name屬性
    >>>c1.name
    '豐田'
    
  • 若要實現(xiàn)類似于私有變量的特征,python內(nèi)部采用了一種叫做name mangling名字改編的技術(shù)驾中。在python中定義私有變量唉堪,只需在變量名或函數(shù)名前加上兩個下劃線"__",則該函數(shù)或變量就會變?yōu)樗接屑缑瘢挥袃?nèi)部可以訪問巨坊,外部不能訪問。

    class Car:
          __name = '本田' #定義成私有變量 
    >>>c1 = Car()
    >>>c1.name #直接用點操作符訪問此改,會報錯,屬于外部調(diào)用
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Car' object has no attribute 'name'
    >>>c1.__name #也會報錯
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Car' object has no attribute '__name'
    

    在外部趾撵,私有變量”被隱藏“起來了,不能訪問共啃。理論上占调,若要訪問私有變量,可通過在類中定義方法getname移剪,內(nèi)部調(diào)用來訪問:

    class Car:
      __name = '本田'
      def getname(self):
        return self.__name
    >>>c2 = Car()
    >>>c2.__name  #仍會報錯
    >>>c2.getname() #成功運行究珊,此時的getname()是在內(nèi)部調(diào)用name屬性
    '本田'
    #注意一下下面這種錯誤的修改私有變量方式
    >>>c2.__name = '豐田'
    #表面上看,外部代碼“成功”地修改了__name變量纵苛,但實際上這個__name變量和class內(nèi)部的__name變量不是一個變量剿涮!
    >>>c2.__name
    '豐田'
    >>>c2.getname()#返回class內(nèi)部self.__name
    '本田'
    

    雖然上述代碼成功運行,而實際上攻人,私有變量只是名字重整取试,被python改了名字,變?yōu)榱?em>類名_變量名而已怀吻。其實python是偽私有機制瞬浓,python的類是無權(quán)限控制的,變量可被外部調(diào)用蓬坡。

    >>>c2._Car__name #還是用.操作符猿棉,對象._類名__變量名即可
    '本田'
    
  • 注意:

    1磅叛、不同版本的Python解釋器可能會把__name改成不同的變量名,不一定是_Car__name萨赁!

    2弊琴、在Python中,變量名類似__xxx__的杖爽,也就是以雙下劃線開頭敲董,并且以雙下劃線結(jié)尾的,是特殊變量(魔法方法)掂林,特殊變量是可以直接訪問的臣缀,不是private變量坝橡。所以泻帮,不能用__name____score__這樣的變量名來定義私有變量计寇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锣杂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子番宁,更是在濱河造成了極大的恐慌元莫,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝶押,死亡現(xiàn)場離奇詭異踱蠢,居然都是意外死亡,警方通過查閱死者的電腦和手機棋电,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門茎截,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赶盔,你說我怎么就攤上這事企锌。” “怎么了于未?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵撕攒,是天一觀的道長。 經(jīng)常有香客問我烘浦,道長抖坪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任闷叉,我火速辦了婚禮柳击,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘片习。我一直安慰自己捌肴,他們只是感情好蹬叭,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著状知,像睡著了一般秽五。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饥悴,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天坦喘,我揣著相機與錄音,去河邊找鬼西设。 笑死瓣铣,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的贷揽。 我是一名探鬼主播棠笑,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼禽绪!你這毒婦竟也來了蓖救?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤印屁,失蹤者是張志新(化名)和其女友劉穎循捺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雄人,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡从橘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了础钠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恰力。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖珍坊,靈堂內(nèi)的尸體忽然破棺而出牺勾,到底是詐尸還是另有隱情,我是刑警寧澤阵漏,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布驻民,位于F島的核電站,受9級特大地震影響履怯,放射性物質(zhì)發(fā)生泄漏回还。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一叹洲、第九天 我趴在偏房一處隱蔽的房頂上張望柠硕。 院中可真熱鬧,春花似錦、人聲如沸蝗柔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽癣丧。三九已至槽畔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胁编,已是汗流浹背厢钧。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嬉橙,地道東北人早直。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像市框,于是被迫代替她去往敵國和親霞扬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

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