python中類的神祕面紗

看完篇你就可以飄起來了

一:實例化過程:

實例化:其實就是以People類爲模版,在內存裏開闢一塊空間,存上數據,賦值成一個變量名

class People(object):

    def __init__(self, name, sex='F'):
        self.name = name
        self.sex = sex

    def people_name(self):
        print('我的名字叫:', self.name)


people = People('范冰冰')  # 實例化這個類,此時的people就是類People的實例化對象
people.people_name()

看完以上代碼回答三個問題:

   1.爲什麼有__init__  ????

   2.__init__(self)裏面爲什麼有self   ????

   3.__init__(self):中self.name=name,這個self做什麼    ????

   4.方法def people_name(self):中self做什麼    ????

靜靜的看完下面的內容,你就回明白了~~

實例化的過程:

其實self,就是實例本身(這裏的self其實就是people)!你實例化時python會自動把這個實例本身通過self參數傳進去。

所以:

初始化一個角色,就需要調用這個類一次:

people1 = People('范冰冰'),生成一個個體,會自動把參數傳給People下面的__init__(...)方法

people2 = People('李晨')

雖然我們沒有顯性的去調用__init__傳值,其實類在調用他自己的__init__(…)時,自己幫你給self參數賦值了, 

比如:

程序執行people1 = People('范冰冰')時,python的解釋器其實幹了兩件事(回到上面的圖片解說):

  1. 在內存中開闢一塊空間指向people1這個變量名
  2. 調用People這個類並執行其中的__init__(…)方法,相當於People.__init__(people1,'范冰冰','F'),這樣就把('范冰冰','F')跟people1關聯起來,既然關聯起來了,那麼我們當然可以用prople1.name,prople1.sex的方式調用了。所以,爲實現這種關聯,在調用__init__方法時,就必須把r1這個變量也傳進去,否則__init__不知道要把那3個參數跟誰關聯呀。
  3. 所以這個__init__(…)方法裏的,self.name = name , self.sex= sex就是要把這幾個值 存到prople1的內存空間裏

那麼:

people_name(self)方法 爲什麼也還需要self參數麼? 不是在初始化角色的時候 ,就已經把角色的屬性跟prople1綁定好了麼?

people = People('范冰冰') 
people.people_name() #等價於:People.people_name(people,”范冰冰")

細心的同學可能發現,我們在調用方法 people_name(self):時,並沒有給self傳值,假裝不存在,不過Python還是會自動的幫你把people賦值給self這個參數,所以啊,你在 people_name(self)方法裏面可以隨意訪問people其他屬性(如:self.name,其實就是是等價於people.name方式去調用)

最後:

  1. “實例化”, 就是把一個虛擬的抽象的類,通過這個動作,變成了一個具體的對象了, 這個對象就叫做實例
  2. 剛纔定義的這個類體現了面向對象的第一個基本特性,封裝,其實就是使用構造方法將內容封裝到某個具體對象中,然後通過對象直接或者self間接獲取被封裝的內容
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章