python之什么是初始化,實例化,區別


---恢復內容開始---

一.首先必須先了解類和實例的區別

類是你定義的這個新類型,這個類型可以有很多個實例。
比如  a = A(),A是個類,a就是A的一個實例,同樣可以b=A(),b也是A的一個實例。
初始化函數__init__在實例剛創建完成的時候調用,這里可以對這個實例的屬性進行初始化   

class  A:
     def  __init__( self ,num):
         self .data  =  num
=  A( 1 )

= A(2)

 

Python 中類和實例的通俗講解

原創 2016年10月12日 11:59:23

  •  轉自http://blog.csdn.net/Four_Infinite/article/details/52795877
  • ·  這篇文章是我看到的講解Python類與實例的文章中講的比較通俗易懂的,因此我將其轉載過來,供大家共同學習!

1Python 中類和實例的通俗講解

原創 2016年10月12日 11:59:23

  •  
  • ·  這篇文章是我看到的講解Python類與實例的文章中講的比較通俗易懂的,因此我將其轉載過來,供大家共同學習!

 

class Person:

 

注意,類的名稱一般用大寫字母開頭,這是慣例。當然,如果故意不遵循此慣例,也未嘗不可,但是,會給別人閱讀乃至於自己以后閱讀帶來麻煩。既然大家都是靠右走的,你就別非要在路中間睡覺了。

接下來,一般都要編寫構造函數,在寫這個函數之前,先解釋一下什么是構造函數。

class Person:

    def __init__(self, name, lang, website):

        self.name = name

        self.lang = lang

        self.website = website

上面的類中,首先呈現出來的是一個名為:init()的函數,注意,這個函數是以兩個下划線開始,然后是init,最后以兩個下划線結束。這是一個函數,就跟我們此前學習過的函數一樣的函數。但是,這個函數又有點奇特,它的命名是用“__”開始和結束。

請看官在這里要明確一個基本概念,類就是一種對象類型,和跟前面學習過的數值、字符串、列表等等類型一樣。比如這里構建的類名字叫做Person,那么就是我們要試圖建立一種對象類型,這種類型被稱之為Person,就如同有一種對象類型是list一樣。

在構建Person類的時候,首先要做的就是對這種類型進行初始化,也就是要說明這種類型的基本結構,一旦這個類型的對象被調用了,第一件事情就是要運行這個類型的基本結構,也就是類Person的基本結構。就好比我們每個人,在頭腦中都有關於“人”這樣一個對象類型(對應着類),一旦遇到張三(張三是一個具體人),我們首先運行“人”這個類的基本結構:一個鼻子兩只眼,鼻子下面一張嘴。如果張三符合這個基本機構,我們不會感到驚詫(不報錯),如果張三不符合這個基本結構(比如三只眼睛),我們就會感到驚詫(報錯了)。

由於類是我們自己構造的,那么基本結構也是我們自己手動構造的。在類中,基本結構是寫在init()這個函數里面。故這個函數稱為構造函數,擔負着對類進行初始化的任務。

還是回到Person這個類,如果按照上面的代碼,寫好了,是不是init()就運行起來了呢?不是!這時候還沒有看到張三呢,必須看到張三才能運行。所謂看到張三,看到張三這樣一個具體的實實在在的人,此動作,在python中有一個術語,叫做實例化。當類Person實例化后立刻運行init()函數。
上面關於類的講解很形象生動!

#!/usr/bin/env python

 #coding:utf-8

 

class Person:

     def __init__(self, name, lang, website):

         self.name = name

         self.lang = lang

         self.website = website

 

info = Person("qiwsir","python","qiwsir.github.io")     #實例化Person

 print "info.name=",info.name

 print "info.lang=",info.lang

 print "info.website=",info.website

 

#上面代碼的運行結果:

 

info.name= qiwsir

 info.lang= python

 info.website= qiwsir.github.io

在上面的代碼中,建立的類Person,構造函數申明了這個類的基本結構:name,lang,website。

注意觀察:info=Person(“qiwsir”,”python”,”qiwsir.github.io”),這句話就是將類Person實例化了。也就是在內存中創建了一個對象,這個對象的類型是Person類型,這個Person類型是什么樣子的呢?就是init()所構造的那樣。在實例化時,必須通過參數傳入具體的數據:name=”qiwsir”,lang=”python”,website=”qiwsir.github.io”。這樣在內存中就存在了一個對象,這個對象的類型是Person,然后通過賦值語句,與變量info建立引用關系。請看官回憶以前已經講述過的變量和對象的引用關系。

類和實例
•“類提供默認行為,是實例的工廠”,我覺得這句原話非常經典,一下道破了類和實例的關系。看上面代碼,體會一下,是不是這個理?所謂工廠,就是可以用同一個模子做出很多具體的產品。類就是那個模子,實例就是具體的產品。所以,實例是程序處理的實際對象。
•類是由一些語句組成,但是實例,是通過調用類生成,每次調用一個類,就得到這個類的新的實例。
•對於類的:class Person,class是一個可執行的語句。如果執行,就得到了一個類對象,並且將這個類對象賦值給對象名(比如Person)。

self的作用

細心的看官可能注意到了,在構造函數中,第一個參數是self,但是在實例化的時候,似乎沒有這個參數什么事兒,那么self是干什么的呢?

self是一個很神奇的參數。

在Person實例化的過程中,數據”qiwsir”,”python”,”qiwsir.github.io”通過構造函數(init())的參數已經存入到內存中,並且這些數據以Person類型的面貌存在組成一個對象,這個對象和變量info建立的引用關系。這個過程也可說成這些數據附加到一個實例上。這樣就能夠以:object.attribute的形式,在程序中任何地方調用某個數據,例如上面的程序中以info.name得到”qiwsir”這個數據。這種調用方式,在類和實例中經常使用,點號“.”后面的稱之為類或者實例的屬性。

這是在程序中,並且是在類的外面。如果在類的里面,想在某個地方使用傳入的數據,怎么辦?

隨着學習的深入,看官會發現,在類內部,我們會寫很多不同功能的函數,這些函數在類里面有另外一個名稱,曰:方法。那么,通過類的構造函數中的參數傳入的這些數據也想在各個方法中被使用,就需要在類中長久保存並能隨時調用這些數據。為了解決這個問題,在類中,所有傳入的數據都賦給一個變量,通常這個變量的名字是self。注意,這是習慣,而且是共識,所以,看官不要另外取別的名字了。

在構造函數中的第一個參數self,就是起到了這個作用——接收實例化過程中傳入的所有數據,這些數據是通過構造函數后面的參數導入的。顯然,self應該就是一個實例(准確說法是應用實例),因為它所對應的就是具體數據。

如果將上面的類增加兩句,看看效果:

#!/usr/bin/env python

 #coding:utf-8

 

class Person:

     def __init__(self, name, lang, website):

         self.name = name

         self.lang = lang

         self.website = website

 

        print self          #打印,看看什么結果

        print type(self)

 

#運行結果

<__main__.Person instance at 0xb74a45cc>

 <type 'instance'>

證實了推理。self就是一個實例(准確說是實例的引用變量)。

self這個實例跟前面說的那個info所引用的實例對象一樣,也有屬性。那么,接下來就規定其屬性和屬性對應的數據。上面代碼中:self.name = name,就是規定了self實例的一個屬性,這個屬性的名字也叫做name,這個屬性的數據等於構造函數的參數name所導入的數據。注意,self.name中的name和構造函數的參數name沒有任何關系,它們兩個一樣,只不過是一種起巧合(經常巧合),或者說是寫代碼的人懶惰,不想另外取名字而已,無他。當然,如果寫成self.xxxooo = name,也是可以的。

其實,從效果的角度來理解,可能更簡單一些,那就是類的實例info對應着self,info通過self導入實例屬性的所有數據。

當然,self的屬性數據,也不一定非得是由參數傳入的,也可以在構造函數中自己設定。比如:

#!/usr/bin/env python

 #coding:utf-8

 

class Person:

     def __init__(self, name, lang, website):

         self.name = name

         self.lang = lang

         self.website = website

         self.email = "qiwsir@gmail.com"     #這個屬性不是通過參數傳入的

 

info = Person("qiwsir","python","qiwsir.github.io")

 print "info.name=",info.name

 print "info.lang=",info.lang

 print "info.website=",info.website

 print "info.email=",info.email      #info通過self建立實例,並導入實例屬性數據

 

#運行結果

 

info.name= qiwsir

 info.lang= python

 info.website= qiwsir.github.io

 info.email= qiwsir@gmail.com    #打印結果

通過這個例子,其實讓我們拓展了對self的認識,也就是它不僅僅是為了在類內部傳遞參數導入的數據,還能在構造函數中,通過self.attribute的方式,規定self實例對象的屬性,這個屬性也是類實例化對象的屬性,即做為類通過構造函數初始化后所具有的屬性。所以在實例info中,通過info.email同樣能夠得到該屬性的數據。在這里,就可以把self形象地理解為“內外兼修”了。或者按照前面所提到的,將info和self對應起來,self主內,info主外。

其實,self的話題還沒有結束,后面的方法中還會出現它。它真的神奇呀。

構造函數的參數

前面已經說過了,構造函數init就是一個函數,只不過長相有點古怪罷了。那么,函數中的操作在構造函數中依然可行。比如:

def __init__(self,*args):

     pass

 

這種類型的參數:*args和前面講述函數參數一樣,就不多說了。忘了的看官,請去復習。但是,self這個參數是必須的,因為它要來建立實例對象。

很多時候,並不是每次都要從外面傳入數據,有時候會把構造函數的某些參數設置默認值,如果沒有新的數據傳入,就應用這些默認值。比如:

class Person:

     def __init__(self, name, lang="golang", website="www.google.com"):

         self.name = name

         self.lang = lang

         self.website = website

         self.email = "qiwsir@gmail.com"

 

laoqi = Person("LaoQi")     #導入一個數據name="LaoQi",其它默認值

info = Person("qiwsir",lang="python",website="qiwsir.github.io")    #全部重新導入數據

 

print "laoqi.name=",laoqi.name

 print "info.name=",info.name

 print "-------"

 print "laoqi.lang=",laoqi.lang

 print "info.lang=",info.lang

 print "-------"

 print "laoqi.website=",laoqi.website

 print "info.website=",info.website

 

#運行結果

 

laoqi.name= LaoQi

 info.name= qiwsir

 -------

 laoqi.lang= golang

 info.lang= python

 -------

 laoqi.website= www.google.com

 info.website= qiwsir.github.io

在這段代碼中,看官首先要體會一下,“類是實例的工廠”這句話的含義,通過類Person生成了兩個實例:laoqi、info

此外,在看函數賦值的情況,允許設置默認參數值。

至此,僅僅是初步構建了一個類的基本結構,完成了類的初始化。

 

class Person:

 

注意,類的名稱一般用大寫字母開頭,這是慣例。當然,如果故意不遵循此慣例,也未嘗不可,但是,會給別人閱讀乃至於自己以后閱讀帶來麻煩。既然大家都是靠右走的,你就別非要在路中間睡覺了。

接下來,一般都要編寫構造函數,在寫這個函數之前,先解釋一下什么是構造函數。

class Person:

    def __init__(self, name, lang, website):

        self.name = name

        self.lang = lang

        self.website = website

上面的類中,首先呈現出來的是一個名為:init()的函數,注意,這個函數是以兩個下划線開始,然后是init,最后以兩個下划線結束。這是一個函數,就跟我們此前學習過的函數一樣的函數。但是,這個函數又有點奇特,它的命名是用“__”開始和結束。

請看官在這里要明確一個基本概念,類就是一種對象類型,和跟前面學習過的數值、字符串、列表等等類型一樣。比如這里構建的類名字叫做Person,那么就是我們要試圖建立一種對象類型,這種類型被稱之為Person,就如同有一種對象類型是list一樣。

在構建Person類的時候,首先要做的就是對這種類型進行初始化,也就是要說明這種類型的基本結構,一旦這個類型的對象被調用了,第一件事情就是要運行這個類型的基本結構,也就是類Person的基本結構。就好比我們每個人,在頭腦中都有關於“人”這樣一個對象類型(對應着類),一旦遇到張三(張三是一個具體人),我們首先運行“人”這個類的基本結構:一個鼻子兩只眼,鼻子下面一張嘴。如果張三符合這個基本機構,我們不會感到驚詫(不報錯),如果張三不符合這個基本結構(比如三只眼睛),我們就會感到驚詫(報錯了)。

由於類是我們自己構造的,那么基本結構也是我們自己手動構造的。在類中,基本結構是寫在init()這個函數里面。故這個函數稱為構造函數,擔負着對類進行初始化的任務。

還是回到Person這個類,如果按照上面的代碼,寫好了,是不是init()就運行起來了呢?不是!這時候還沒有看到張三呢,必須看到張三才能運行。所謂看到張三,看到張三這樣一個具體的實實在在的人,此動作,在python中有一個術語,叫做實例化。當類Person實例化后立刻運行init()函數。
上面關於類的講解很形象生動!

#!/usr/bin/env python

 #coding:utf-8

 

class Person:

     def __init__(self, name, lang, website):

         self.name = name

         self.lang = lang

         self.website = website

 

info = Person("qiwsir","python","qiwsir.github.io")     #實例化Person

 print "info.name=",info.name

 print "info.lang=",info.lang

 print "info.website=",info.website

 

#上面代碼的運行結果:

 

info.name= qiwsir

 info.lang= python

 info.website= qiwsir.github.io

在上面的代碼中,建立的類Person,構造函數申明了這個類的基本結構:name,lang,website。

注意觀察:info=Person(“qiwsir”,”python”,”qiwsir.github.io”),這句話就是將類Person實例化了。也就是在內存中創建了一個對象,這個對象的類型是Person類型,這個Person類型是什么樣子的呢?就是init()所構造的那樣。在實例化時,必須通過參數傳入具體的數據:name=”qiwsir”,lang=”python”,website=”qiwsir.github.io”。這樣在內存中就存在了一個對象,這個對象的類型是Person,然后通過賦值語句,與變量info建立引用關系。請看官回憶以前已經講述過的變量和對象的引用關系。

類和實例
•“類提供默認行為,是實例的工廠”,我覺得這句原話非常經典,一下道破了類和實例的關系。看上面代碼,體會一下,是不是這個理?所謂工廠,就是可以用同一個模子做出很多具體的產品。類就是那個模子,實例就是具體的產品。所以,實例是程序處理的實際對象。
•類是由一些語句組成,但是實例,是通過調用類生成,每次調用一個類,就得到這個類的新的實例。
•對於類的:class Person,class是一個可執行的語句。如果執行,就得到了一個類對象,並且將這個類對象賦值給對象名(比如Person)。

self的作用

細心的看官可能注意到了,在構造函數中,第一個參數是self,但是在實例化的時候,似乎沒有這個參數什么事兒,那么self是干什么的呢?

self是一個很神奇的參數。

在Person實例化的過程中,數據”qiwsir”,”python”,”qiwsir.github.io”通過構造函數(init())的參數已經存入到內存中,並且這些數據以Person類型的面貌存在組成一個對象,這個對象和變量info建立的引用關系。這個過程也可說成這些數據附加到一個實例上。這樣就能夠以:object.attribute的形式,在程序中任何地方調用某個數據,例如上面的程序中以info.name得到”qiwsir”這個數據。這種調用方式,在類和實例中經常使用,點號“.”后面的稱之為類或者實例的屬性。

這是在程序中,並且是在類的外面。如果在類的里面,想在某個地方使用傳入的數據,怎么辦?

隨着學習的深入,看官會發現,在類內部,我們會寫很多不同功能的函數,這些函數在類里面有另外一個名稱,曰:方法。那么,通過類的構造函數中的參數傳入的這些數據也想在各個方法中被使用,就需要在類中長久保存並能隨時調用這些數據。為了解決這個問題,在類中,所有傳入的數據都賦給一個變量,通常這個變量的名字是self。注意,這是習慣,而且是共識,所以,看官不要另外取別的名字了。

在構造函數中的第一個參數self,就是起到了這個作用——接收實例化過程中傳入的所有數據,這些數據是通過構造函數后面的參數導入的。顯然,self應該就是一個實例(准確說法是應用實例),因為它所對應的就是具體數據。

如果將上面的類增加兩句,看看效果:

#!/usr/bin/env python

 #coding:utf-8

 

class Person:

     def __init__(self, name, lang, website):

         self.name = name

         self.lang = lang

         self.website = website

 

        print self          #打印,看看什么結果

        print type(self)

 

#運行結果

<__main__.Person instance at 0xb74a45cc>

 <type 'instance'>

證實了推理。self就是一個實例(准確說是實例的引用變量)。

self這個實例跟前面說的那個info所引用的實例對象一樣,也有屬性。那么,接下來就規定其屬性和屬性對應的數據。上面代碼中:self.name = name,就是規定了self實例的一個屬性,這個屬性的名字也叫做name,這個屬性的數據等於構造函數的參數name所導入的數據。注意,self.name中的name和構造函數的參數name沒有任何關系,它們兩個一樣,只不過是一種起巧合(經常巧合),或者說是寫代碼的人懶惰,不想另外取名字而已,無他。當然,如果寫成self.xxxooo = name,也是可以的。

其實,從效果的角度來理解,可能更簡單一些,那就是類的實例info對應着self,info通過self導入實例屬性的所有數據。

當然,self的屬性數據,也不一定非得是由參數傳入的,也可以在構造函數中自己設定。比如:

#!/usr/bin/env python

 #coding:utf-8

 

class Person:

     def __init__(self, name, lang, website):

         self.name = name

         self.lang = lang

         self.website = website

         self.email = "qiwsir@gmail.com"     #這個屬性不是通過參數傳入的

 

info = Person("qiwsir","python","qiwsir.github.io")

 print "info.name=",info.name

 print "info.lang=",info.lang

 print "info.website=",info.website

 print "info.email=",info.email      #info通過self建立實例,並導入實例屬性數據

 

#運行結果

 

info.name= qiwsir

 info.lang= python

 info.website= qiwsir.github.io

 info.email= qiwsir@gmail.com    #打印結果

通過這個例子,其實讓我們拓展了對self的認識,也就是它不僅僅是為了在類內部傳遞參數導入的數據,還能在構造函數中,通過self.attribute的方式,規定self實例對象的屬性,這個屬性也是類實例化對象的屬性,即做為類通過構造函數初始化后所具有的屬性。所以在實例info中,通過info.email同樣能夠得到該屬性的數據。在這里,就可以把self形象地理解為“內外兼修”了。或者按照前面所提到的,將info和self對應起來,self主內,info主外。

其實,self的話題還沒有結束,后面的方法中還會出現它。它真的神奇呀。

構造函數的參數

前面已經說過了,構造函數init就是一個函數,只不過長相有點古怪罷了。那么,函數中的操作在構造函數中依然可行。比如:

def __init__(self,*args):

     pass

  • 1
  • 2

這種類型的參數:*args和前面講述函數參數一樣,就不多說了。忘了的看官,請去復習。但是,self這個參數是必須的,因為它要來建立實例對象。

很多時候,並不是每次都要從外面傳入數據,有時候會把構造函數的某些參數設置默認值,如果沒有新的數據傳入,就應用這些默認值。比如:

class Person:

     def __init__(self, name, lang="golang", website="www.google.com"):

         self.name = name

         self.lang = lang

         self.website = website

         self.email = "qiwsir@gmail.com"

 

laoqi = Person("LaoQi")     #導入一個數據name="LaoQi",其它默認值

info = Person("qiwsir",lang="python",website="qiwsir.github.io")    #全部重新導入數據

 

print "laoqi.name=",laoqi.name

 print "info.name=",info.name

 print "-------"

 print "laoqi.lang=",laoqi.lang

 print "info.lang=",info.lang

 print "-------"

 print "laoqi.website=",laoqi.website

 print "info.website=",info.website

 

#運行結果

 

laoqi.name= LaoQi

 info.name= qiwsir

 -------

 laoqi.lang= golang

 info.lang= python

 -------

 laoqi.website= www.google.com

 info.website= qiwsir.github.io

 

在這段代碼中,看官首先要體會一下,“類是實例的工廠”這句話的含義,通過類Person生成了兩個實例:laoqi、info

此外,在看函數賦值的情況,允許設置默認參數值。

至此,僅僅是初步構建了一個類的基本結構,完成了類的初始化。

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM