1. 程式人生 > >課時37:類與對象:面向對象編程

課時37:類與對象:面向對象編程

c++和java 語言 clas 根據 調用 自己的 編程 this 道理

目錄:

  一、self是什麽

  二、Python的魔法方法

  三、公有和私有

  四、課時37課後習題及答案

*****************

一、self是什麽

*****************

對象的方法都有一個self參數,那這個self參數是什麽呢?如果之前接觸過其它的編程語言,例如c++,那麽你應該很容易對號入座,Python的self其實就相當於C++的this指針。

如果把類比作是圖紙,那麽由類實例化後的對象才是真正可以住的房子。根據一張圖紙就可以設計出成千上萬的房子,它們長得都差不多,但它們都有不同的主人。每個人都只能回到自己的家裏,陪伴自己的孩子...所以self這裏相當於每個房子的門牌號,有了self,你就可以輕松找到自己的房子。Python的self是同一個道理,由同一個類可以生成無數的對象,當一個對象的方法被調用的時候,對象會將自身的引用作為第一個參數傳給該方法,那麽Python就知道需要操作哪個對象的方法了。

通過一個例子感受下:

class Ball:
    def setName(self, name):
        self.name = name
    def kick(self):
    print("我叫%s,該死的,誰踢我..." % self.name)
>>> a = Ball()
>>> a.setName(球A)
>>> # 第一個參數self告訴Python是a對象在調用方法,因為是隱藏的並且由Python自己傳入,所以我們這裏不需要寫進來。
>>> b = Ball()
>>> b.setName(
球B) >>> c = Ball() >>> c.setName(土豆) >>> a.kick() 我叫球A,該死的,誰踢我... >>> b.kick() 我叫球B,該死的,誰踢我... >>> c.kick() 我叫土豆,該死的,誰踢我...

self參數的詳解可以參考博客:https://blog.csdn.net/CLHugh/article/details/75000104

**************************

二、Python的魔法方法

**************************

Python的對象天生擁有一些神奇的方法,它們是面向對象的Python的一切。Python的這些具有魔力的方法,總是被下劃線所包圍的,今天就來說一說一個最基本的特殊方法:_ _init_ _()。

通常把_ _init_ _()方法稱作構造方法,_ _init_ _()的魔力體現在只要實例話一個對象,這個方法就會在這個對象被創建時自動調用(在c++裏可以看到類似的東西,叫“構造函數”)。

其實,實例化對象時是可以傳入參數的,這些參數會自動傳入_ _init_ _()方法中,可以通過重寫這個方法來自定義對象的初始化操作。舉個例子:

class Ball:
    def __init__(self, name):
    self.name = name
    def kick(self):
    print("我叫%s,該死的,誰踢我..." % self.name)
>>> p = Ball("土豆")
>>> p.kick()
我叫土豆,該死的,誰踢我...

******************

三、公有和私有

******************

一般面向對象的編程語言都會區分公有和私有的數據類型,像c++和Java它們使用public和private關鍵字,用於聲明數據是公有的還是私有的,但在Python中並沒有用類似的關鍵字來修飾。

難道Python所有東西都是透明的?也不全是,默認上對象的屬性和方法都是公開的,可以直接通過點操作符(.)進行訪問:

>>> class Person:
    name = 小甲魚

    
>>> p = Person()
>>> p.name
小甲魚

為了實現類似私有變量的特征,Python內部采用了一種叫name mangling(名字改編)的技術,在Python中定義私有變量只需要在變量名或函數名前加上“_ _”兩個下劃線,那麽這個函數或變量就會成為私有的了:

>> class Person:
    __name = 小甲魚

    
>>> p = Person()
>>> p.__name
Traceback (most recent call last):
  File "<pyshell#23>", line 1, in <module>
    p.__name
AttributeError: Person object has no attribute __name

這樣在外部將變量名“隱藏”起來了,理論上如果要訪問,就需要從內部進行:

class Person:
      __name = 小甲魚
      def __init__(self,name):
            self.__name = name
      def getName(self):
            return self.__name
>>> p = Person("小甲魚")
>>> p.__name
Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    p.__name
AttributeError: Person object has no attribute __name
>>> p.getName()
小甲魚

但是你認真琢磨一下這個技術的名字name mangling(名字改編),那麽不難發現其實Python只是動了一下手腳,把雙下橫線開頭的變量進行了改名而已。實際上在外部你使用“_類名_ _變量名”即可訪問雙下橫線開頭的私有變量了:

>>> p._Person__name
小甲魚

(註:Python目前的私有機制其實是偽私有,Python的類是沒有權限控制的,所有變量都是可以被外部調用的。)

********************************

四、課時37課後習題及答案

********************************

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

課時37:類與對象:面向對象編程