與對象的第一次相遇
類
類,其實就是一類具有共同特征的事物。古人說,“物以類聚,人以群分”,說的也是這個道理。生物學界的“界門綱目科屬種”,其實也是按照事物某些共同的特征來劃分的。
前面我們說到,類是具有共同特征的事物。所謂的共同特征在python中的屬性。python中的屬性分為數據屬性和函數屬性(類似於java中的屬性和方法),而數據屬性中又分為類屬性和實例屬性。也許你會問,數據屬性為什麽又要分為類屬性和實例屬性呢?存在一個“美女”類,她們共有的特征就是白皙的皮膚,漂亮的臉蛋,姣好的身材,我們可以把這些特征劃為類屬性。但是,她們每個人都是有這自己的特性,比如她們的名字、年齡等都是不盡相同的,因此,我們需要把這些定義為實例屬性。函數屬性,其實就是一些共有的行為方法。比如說,女明星都會唱歌跳舞。
現在,我們用python語言來實現一個“Beauty”類
1 class Beauty: 2 {"face":"鵝蛋臉","figure":"姣好","skin":"白皙"}#這些是類屬性 3 4 def __init(self,name,age):#這些是實例屬性 5 self.name=name 6 self.age=age 7 8 def sing():#函數屬性 9 print("I can sing well") 10 def dance():11 print("I can dance well,t 對象在使用中,我們可以把類理解為一個模版。我們可以通過這個模版,來創建一些實例,也就是創建對象。對象就是類的實例。
1 class Beauty: 2 common={"face":"鵝蛋臉","figure":"姣好","skin":"白皙"}#這些是類屬性 3 4 def __init__(self,name,age):#這些是實例屬性 5 self.name=name 6 self.age=age7 print("創建實例時,__init__()對象被調用了") 8 def sing(self):#函數屬性 9 print("I can sing well") 10 def dance(self): 11 print("I can dance well,too")
對象
前面,我們定義了一個“Beauty類”,現在,我們用這個模版來創建對象
1 LYF=Beauty("劉亦菲",18) 2 """通過這句代碼,我們創建了LYF這個對象,這句代碼的執行過程是當執行Beauty("劉亦菲",18)時,會自動去調用Beauty中的__init__(self,name,age)方法,並把實際參數“劉亦菲”傳給name,18傳給age,"""
運行代碼,執行結果為
關於__init__()函數的誤區:
__init__()函數,並不等同於java中的構造方法。在執行__init__()之前,對象就已經被創建完成。
實例化對象的過程,我們可以分為兩步:
1.創建對象 LYF=Object.__new__(Beauty)
2.初始化對象。LYF.__init__("劉亦菲",18)
通過觀察,我們發現,上面的函數中都有一個self參數,代表什麽意思呢?其實,self就是指函數的調用者,函數的調用者可以是對象,也可以是類。當調用者是類時,self位置參數必須用一個具體傳入一個具體的實例對象,當調用者是對象時,self參數,可以省略,python解釋器會自動把對象本身作為參數傳進去。
類屬性和對象屬性
對於,我們創建的類時,除了我們自己定義的屬性外,還包含了繼承自Object類內置的屬性。我們可以通過__dict__函數來查看類和對象的屬性。
1 class Beauty: 2 common={"face":"鵝蛋臉","figure":"姣好","skin":"白皙"}#這些是類屬性 3 4 def __init__(self,name,age):#這些是實例屬性 5 self.name=name 6 self.age=age 7 print("創建實例時,__init__()對象被調用了") 8 return None 9 def sing(self):#函數屬性 10 print("I can sing well") 11 def dance(self): 12 print("I can dance well,too") 13 LYF=Beauty("劉亦菲",18) 14 LYF.sing() 15 print(Beauty.__dict__) 16 print(LYF.__dict__)
執行上面的代碼,運行結果為:
創建實例時,__init__()對象被調用了
I can sing well
{‘__module__‘: ‘__main__‘, ‘__init__‘: <function Beauty.__init__ at 0x00000000021822F0>, ‘sing‘: <function Beauty.sing at 0x0000000002182378>, ‘dance‘: <function Beauty.dance at 0x0000000002182400>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Beauty‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Beauty‘ objects>, ‘__doc__‘: None}
{‘name‘: ‘劉亦菲‘, ‘age‘: 18}
python內置類屬性:
__dict__//得到一個屬性字典,包括由類的數據屬性和函數屬性構成
__doc__//得到類的文檔字符串
__name__//得到類的名字
__module__//得到定義類的模塊
__bases__//得到所有的父類
class Beauty: common={"face":"鵝蛋臉","figure":"姣好","skin":"白皙"}#這些是類屬性 def __init__(self,name,age):#這些是實例屬性 self.name=name self.age=age print("創建實例時,__init__()對象被調用了") return None def sing(self):#函數屬性 print("I can sing well") def dance(self): print("I can dance well,too") print(Beauty.__dict__)#得到一個屬性字典,包括由類的數據屬性和函數屬性構成 print(Beauty.__doc__)#得到類的文檔字符串 print(Beauty.__bases__)#得到父類的列表 print(Beauty.__module__)#得到定義類的模塊 print(Beauty.__name__)#得到類名 print(Beauty.__dir__)
運行上面的代碼,執行結果為:
python類屬性中的函數屬性:
1.實例方法
比如Beatuty類中的sing()/dance()方法都是普通方法。
普通方法與類的實例對象綁定,可以訪問、操作類屬性、實例屬性。
2.類方法
類方法是類對象所擁有的方法,需要用修飾器@classmethod
來標識其為類方法,對於類方法,第一個參數必須是類對象,一般以cls
作為第一個參數(當然可以用其他名稱的變量作為其第一個參數,但是大部分人都習慣以‘cls‘作為第一個參數的名字,就最好用‘cls‘了),能夠通過實例對象和類對象去訪問。其實,這也就類似於java中的靜態方法。
類方法與類對象綁定,可以通過類名直接調用,類方法只能操作類屬性,也就是公有屬性。
@classmethod def eat_food(cls): print("Everyone need food,if she wants to live")
運行結果為:
3.靜態方法
靜態方法 需要通過修飾器@staticmethod
來進行修飾,靜態方法不需要多定義cls /self參數,靜態方法不能訪問更不能操作類的屬性和方法。
靜態方法不需要綁定類的實例對象,也不需要綁定類對象。靜態方法。
4.屬性方法
屬性方法需要通過裝飾器@property來進行修飾。
@property可以把一個實例方法變成其同名屬性,以支持.號訪問
---恢復內容結束---
與對象的第一次相遇