1. 程式人生 > >與對象的第一次相遇

與對象的第一次相遇

一個 個人 數據 AC sel one doc 屬性方法 PE

 

類,其實就是一類具有共同特征的事物。古人說,“物以類聚,人以群分”,說的也是這個道理。生物學界的“界門綱目科屬種”,其實也是按照事物某些共同的特征來劃分的。

前面我們說到,類是具有共同特征的事物。所謂的共同特征在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=age
7 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可以把一個實例方法變成其同名屬性,以支持.號訪問

技術分享圖片


---恢復內容結束---

與對象的第一次相遇