日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

對Python中class和instance以及self的用法詳解

系統 1820 0

一. Python 的類和實例

在面向對象中,最重要的概念就是類(class)和實例(instance),類是抽象的模板,而實例是根據類創建出來的一個個具體的 “對象”。

就好比,學生是個較為抽象的概念,同時擁有很多屬性,可以用一個 Student 類來描述,類中可定義學生的分數、身高等屬性,但是沒有具體的數值。而實例是類創建的一個個具體的對象, 每一個對象都從類中繼承有相同的方法,但是屬性值可能不同,如創建一個實例叫 hansry 的學生,其分數為 93,身高為 176,則這個實例擁有具體的數值。

1.類:以Student類為例,在Python中,定義類如下:

            
class Student(object):
  def __init__(self,name,score):
    self.name=name
    self.score=score
          

a.(object)表示的是該類從哪個類繼承下來的,而object類是每個類都會繼承的一個類。 yt

b. __init__ 方法的第一參數永遠是 self,用來表示類創建的實例本身,因此,在 __init__ 方法內部,就可以把各種屬性綁定到self,因為self 本身就是指向創建的實例本身。

c. 有了 __init__ 方法后,在創建實例的時候,就不能傳入空參數,必須傳入與 __init__ 方法匹配的參數,但self本身不需要傳入參數,只需要傳入 self 后面的參數即可。

2.實例: 定義好了類后,就可以通過Student類創建出 Student 的實例,創建實例是通過 類名 + ()實現:

            
student = Student('name', 93)

>>> student.name
"name"
>>> student.score
93

          

a. 其中 Student 是類名稱,('name',93)為要傳入的參數

b. self.name 就是 Student類的屬性變量,為 Student 類所有。同時, name 是外部傳來的參數,不是 Student 類所自帶的。故 self.name = name 的意思就是把外部傳來的參數 name 的值賦值給 Student類自己的屬性變量 self.name .

3.和普通函數相比,在類中定義函數只有一點不同,就是第一參數永遠是類的本身實例變量 self, 并且調用時,不用傳遞該參數。 除此之外,類的方法(函數)和普通函數沒有啥區別。既可以用 默認參數、可變參數或者關鍵字參數等。

二. 類 以及 實例的訪問

1.限制外部對類實例屬性的訪問

既然 Student 類實例本身就擁有這些屬性的數據,那么要訪問這些數據,就沒必要從外面的函數去訪問,而可以在類的內部定義訪問數據的函數,這樣,就可以把 ”數據“ 封裝起來了。這些封裝數據的函數和 Student 類本身是相關聯的,稱之為類的方法:

            
class Student(obiect):
  def __init__(self, name, score):
    self.name = name
    self.score = score
  def print_score(self):
    print "%s: %d" % (self.name, self.score)
          
            
>>> student= Student("hansry",99)
>>> student.print_property()

hansry:99

          

由此可見,從外部看Student類,我們只知道創建實例需要給出 name 和 score。究竟如何打印,是 Student 類內部定義的,這些數據和邏輯被封裝起來了,調用也就變得容易了,但是不知道內部實現的細節。

如果不想讓實例中的內部屬性被外部屬性訪問,則把 name 和 score 變成 __name 和 __score 即可,如下代碼所示:

            
class Student(object):

  def __init__(self, name, score):
    self.__name = name
    self.__score = score
  def print_property(self):
    print "%s: %d" %(self.__name,self.__score)

          
            
>>> student= Student("hansry",99)
>>> student.print_property()
>>> student.__name()

hansry:99
Traceback (most recent call last):
AttributeError: 'Student' object has no attribute '__name'

          

2.開 API 使得外部代碼能夠訪問到里面的屬性,并且對其進行修改

外部代碼訪問到類實例屬性,代碼如下:

            
  def __init__(self,name,score):
    self.__name=name
    self.__score=score
  def print_property(self):
    print("%s:%d"%(self.__name,self.__score))

  def get_name(self):
    return self.__name

  def get_score(self):
    return self.__score 

          
            
name=student.get_name()
score=student.get_score()
print ("%s,%d" % (name,score))
          

外部代碼修改類里面的實例屬性,代碼如下:

            
  def __init__(self,name,score):
    self.__name=name
    self.__score=score
  def print_property(self):
    print("%s:%d"%(self.__name,self.__score))

  def reset_name(self,change_name):
    self.__name = change_name

  def reset_score(self, change_score):
    self.__score = change_score 

          
            
student= Student("hansry",99)
student.print_property()
student.reset_name("simona")
student.reset_score(91)
name=student.get_name()
score=student.get_score()
print ("%s:%d" % (name,score))

hansry:99
simona:91

          

需要注意的是,在Python中,變量名類似 _xxx_的,也就是雙下劃線開頭,并且以下劃線結尾的,是特殊變量,特殊變量是可以直接訪問的,不是 private 變量,不能用 __name__, __score__ 。

三. self 的仔細用法

1.self代表類的實例,而非類。

            
class Student(object):
  def print_self(self):
    print(self)
    print(self.__class__)
          
            
student=Student()
student.print_self()

<__main__.Student object at 0x7fd9095aed90>

            
            
          

從上面例子可得,self代表的只是類的實例,而 self.__class__ 才是類。

2. 定義類的時候,self最好寫上,因為它代表了類的實例。

3. 在繼承時,傳入的是哪個實例,就是那個傳入的實例,而不是指定義了self的類的實例。

            
class Teacher(object):
  def __init__(self,teacher):
    self.teacher=teacher
    print(self.teacher)

  def print_self(self):
    print(self)

class Student(Teacher):
  def __init__(self,student):
    self.student=student    
    print(self.student)

  def print_self_1(self):
    print(self)

          
            
teacher=Teacher("hansry")
student=Student("simona")
student.print_self_1()
student.print_self()

hansry
simona
<__main__.Student object at 0x7fd9095b0950>
<__main__.Student object at 0x7fd9095b0950>

          

在運行 student.print_self() 的時候,這里是調用了 類 Teacher 的 print_self() 函數,此時雖然調用的是 類Teacher的函數,但是此時的實例 self 確是 類 Student 實例化時生成的。

以上這篇對Python中class和instance以及self的用法詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 吴旗县| 平昌县| 南投市| 修水县| 北辰区| 海淀区| 农安县| 伊金霍洛旗| 南皮县| 六盘水市| 石屏县| 治县。| 大石桥市| 行唐县| 漯河市| 鹤峰县| 逊克县| 永平县| 平安县| 濮阳县| 沧源| 林甸县| 澄迈县| 错那县| 资源县| 清河县| 湖口县| 苏尼特右旗| 霍山县| 社旗县| 团风县| 贵州省| 平武县| 丹寨县| 南阳市| 科技| 凤冈县| 榆树市| 兴文县| 溧阳市| 凤翔县|