看完篇你就可以飄起來了
一:實例化過程:
實例化:其實就是以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的解釋器其實幹了兩件事(回到上面的圖片解說):
- 在內存中開闢一塊空間指向people1這個變量名
- 調用People這個類並執行其中的__init__(…)方法,相當於People.__init__(people1,'范冰冰','F'),這樣就把('范冰冰','F')跟people1關聯起來,既然關聯起來了,那麼我們當然可以用prople1.name,prople1.sex的方式調用了。所以,爲實現這種關聯,在調用__init__方法時,就必須把r1這個變量也傳進去,否則__init__不知道要把那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方式去調用)
最後:
- “實例化”, 就是把一個虛擬的抽象的類,通過這個動作,變成了一個具體的對象了, 這個對象就叫做實例
- 剛纔定義的這個類體現了面向對象的第一個基本特性,封裝,其實就是使用構造方法將內容封裝到某個具體對象中,然後通過對象直接或者self間接獲取被封裝的內容