先介紹一下python中的類與對象/實例。然后詳細說明self。說明:對象等同實例,本文稱呼不一致時請自行統一
【一】類與對象/實例
1、類
(1)類由名稱、屬性、方法三部分組成
(2)類是抽象模板,比如學生,汽車可以用Student、Car類來表示
(3)類命名規范:數字、字母、下劃線,數字不能開頭;要駝峰式命名
(4)定義類:
第一種:class 類名:(冒號縮進,代碼塊內含屬性與方法)
第二種:class 類名(object):(--(Object)表示該類從哪個類繼承下來的,Object類是所有類都會繼承的類。--)
#子類繼承父類 class Parent:def pprt(self):print(self)class Child(Parent): #表示子類從父類繼承def cprt(self):print(self) c = Child() c.cprt() # Child類的實例 c.pprt() #self指的是Child類的實例,父類Parent中定義了pprt()方法 p = Parent() p.pprt() # Parent類的實例
(5)關于self:類函數需要定義一個‘self’,不用理會不需要賦值;self不是py關鍵字,但是必填;self可以用其他參數替代,如“this、a”,只是約定俗稱
(6)如下圖:p.sayhello() ,實際上Python解釋成Person.sayhello(p),也就是說把self替換成類的實例
# 實例說明self代表是是對象/實例本身,而非類本身(類中包含多個對象)
# self不必非寫成self,可以其它參數代替,只是約定俗成,但必須寫
class Person:def sayhello(self):print(self)print('***********分割線*************')print('My name is:linda') p=Person() p.sayhello() #等同:Person.sayhello(p)
# 如果我們的定義和調用時均不傳類實例是可以的,這就是類方法 class Person:def sayhello():print()print('***********分割線*************')print('My name is:linda') p=Person() Person.sayhello() # 定義和調用均不傳類實例
2、對象/實例
(1)對象是由類 創建出來的實體,對象也稱實例
(2)對象要從類中繼承方法,具有類里面所有屬性和方法的使用權限
(3)創建方式:對象名 = 類()?? ---如: tom
= Person()
class Person:def sayhello(self):print(self)print('***********分割線*************')print('My name is:linda') p=Person()
3、__init__
方法: ---也叫 初始化方法
類中定義了__init__方法,則表示在創建對象時系統會默認調用此方法,也叫初始化方法
? 由于類起到模板的作用,因此,可以在創建實例的時候,把我們認為必須綁定的屬性強制填寫進去。這里就用到Python當中的一個內置方法__init__
方法,例如在Person類時,把name、age等屬性綁上去:
?
說明:
1、類在創建對象時就已經有默認的屬性(如創建一輛汽車時就已經注定這個車子是什么品牌,有幾個輪子等),所以類的屬性一般定義在__init__方法中
2、__init__方法在創建對象時候被調用,所以屬性通過(對象 = Car(屬性))傳入方法中
【注意點】(1)__init__
方法的第一參數永遠是self
,表示self指向創建的類實例本身,因而,在__init__
方法內部,可以把各種屬性綁定到self,等同于綁定創建的實例本身
(2)__init__
方法 在創建實例時,不可傳入空的參數,必須傳入與__init__
方法匹配的參數,但self不需要傳,Python解釋器會自己把實例變量傳進去
(3)如上圖: self.name = name的意思就是把外部傳來的參數name的值賦值給Person類自己的屬性變量self.name
??????????? 說明:self就是指類本身,self.name就是Person類的屬性變量,是Person類所有。而name是外部傳來的參數,不是Person類所自帶的。
【二】self的詳細說明
1、說明:
(1)# 實例說明self代表是是對象/實例本身,而非類本身(類中可包含多個對象)
(2)# self不必非寫成self,可以其它參數代替,只是約定俗成,但必須寫
(3)# 如果我們的定義和調用時均不傳類實例也是可以的
2、關于類函數/類方法
【?】類函數與普通函數的區別:
僅在于類函數:第一參數永遠是類的本身實例變量self
,調用時,不用傳遞該參數
(1)方法,通俗點來說就是函數; ---把每一項類中所有的功能封裝起來稱為方法,一般方法里的內容就是方法的執行過程
方法多具有執行性
舉例: 比如類表示的是People 也就是人?
? ? ? ? ? ? 人的類中會有一些屬性 這些屬性大概是 身高、體重、姓名等等
? ? ? ? ? ? 那么方法比如是 跑、吃、等等
class Person(object):def __init__(self, name, age):self.name = nameself.age = ageprint('我叫{0},我今年{1}歲'.format(self.name,self.age)) #我叫小明,我今年18歲 person=Person("小明",18) person.name person.age
【說明】Person類實例本身擁有一些數據,那么要訪問這些數據,就不需要從外面的函數去訪問,可直接在Person類的內部定義訪問數據的函數(方法),這樣,就可以把”數據”封裝起來。
這些封裝數據的函數是和Person類本身是關聯起來的,稱之為類的方法
我們從外部看Person類,只需要知道,創建實例需要給出name和age。
而如何打印,都是在Person類的內部定義的,這些數據和邏輯被封裝起來了,調用很容易,但卻不知道內部實現的細節。
如果要讓內部屬性不被外部訪問,可以把屬性的名稱前加上兩個下劃線,在Python中,實例的變量名如果以開頭,就變成了一個私有變量(private),只有內部可以訪問,外部不能訪問
這樣就確保了外部代碼不能隨意修改對象內部的狀態,這樣通過訪問限制的保護,代碼更加健壯
(注意)Python中,變量名類似__xxx__
的,也就是以雙下劃線開頭,且以雙下劃線結尾的,是特殊變量,特殊變量是可以直接訪問的,不是private變量,所以,不可以這樣命名
?