python基礎8之類的特性講解

來源:互聯網
上載者:User

標籤:man   調用   成員   改變   obj   most   hot   format   name   

一、概述

在上篇部落格中我們已經講了一些關於類的知識,我們來回顧以下:

  1. 定義類(class dog(object))-> 執行個體化(d = dog()) -> 執行個體化對象(d)
  2. __init__()建構函式
  3. self.name = name 被稱為屬性、成員變數、欄位
  4. def sayhi(self)  被稱為方法、動態屬性

下面我們繼續學習類的特性。

二、訪問類屬性

2.1 成員變數和參數

class dog(object):    "dog class"     def __init__(self,name):        self.name = name   #類的成員變數                    def sayhi(self):        print("the dog {0} is sayhi".format(self.name))     def eat(self,food):   #傳入一個參數,參數名:food        print("the dog name is {0},it like food is {1}".format(self.name,food)) d = dog("alex") #執行個體化對象d.sayhi()   #調sayhi方法d.eat("hotdog")  #調eat方法 #輸出the dog alex is sayhithe dog name is alex,it like food is hotdog

①很多人產生疑問,為什麼eat方法裡面會傳入一個food的參數名呢?而這個為什麼不能再其他方法裡面用呢?而self.name就可以呢?

因為food它只是作為eat方法的一個參數,不是類的成員變數,只能在自己的方法裡面使用,而self.name是類的成員變數,它是類的屬性,所以可以被調用。

②為什麼類的每一個方法第一個參數都是self呢?

是因為類在執行個體化的時候,需要把執行個體對象本身傳進來,好去調用對象本身的屬性和方法。

2.2 修改對象的屬性

class dog(object):    "dog class"     def __init__(self,name,age):        self.name = name          self.age = age     def sayhi(self,update_age):  #傳入一個update_age參數        self.age = update_age   #修改對象的age屬性 d = dog("alex",18)d.sayhi(22)  #第1次在類的方法中修改print(d.age)  d.age = 19   #第2次在類外面修改print(d.age) #輸出2219

 註:就是說在類的方法中或者類的外面都可以修改類的屬性

三、定義私人屬性

說明:之前我們說,我們可以訪問類的屬性,也可以隨意修改類的屬性,但是類屬性一旦被定義成私人的,對外是不可以被訪問的,也是不可以隨意被改變的。

3.1 定義私人屬性

class dog(object):    "dog class"     def __init__(self,name,age):        self.name = name        self.age = age        self.__sex = "man"  #定義私人屬性__sex     def sayhi(self,update_age):        self.age = update_age d = dog("alex",18)print(d.__sex) #訪問私人屬性__sex #輸出Traceback (most recent call last):  File "E:/PycharmProjects/pythontest/day6/封裝.py", line 16, in <module>    print(d.__sex)AttributeError: ‘dog‘ object has no attribute ‘__sex‘  #報錯,說沒有__sex這個屬性

從上面的例子可以看出,私人屬性是不可以訪問的,更不可以修改。但是我們就想訪問,但是不去修改,我們怎麼辦呢?

3.2 get方法訪問私人屬性

雖然我們外部不能訪問私人屬性,但是我們在類內部可以訪問私人屬性,所以我們用如下方法,訪問私人屬性

class dog(object):    "dog class"     def __init__(self,name):        self.name = name        self.__sex = "man"  #定義私人屬性sex     def get_sex(self):  #定義get方法        return self.__sex   #返回私人屬性sex值 d = dog("alex")d_sex = d.get_sex()  #調用執行個體對象d的get_sex()方法擷取私人屬性sexprint(d_sex) #輸出man

註:這種方法只能訪問私人屬性,但是不能更改私人屬性

3.3 強制訪問私人屬性

上面的方法只能訪問,但是不能修改,下面這種方法就更為暴力,可以訪問也可以修改,就是:對象名._類名__屬性名稱

 

class dog(object):    "dog class"     def __init__(self,name):        self.name = name        self.__sex = "man"  #定義私人方法sex d = dog("alex")print(d._dog__sex)  #訪問私人屬性sexd._dog__sex = "woman"  #修改私人屬性sexprint(d._dog__sex) #列印修改後的值#輸出manwoman

 

四、總結
  1. 定義私人屬性:self.__private_attr_name = private_attr_name
  2. 強制訪問私人屬性:對象名._類名__屬性名稱(d._dog__sex)
  3. 對外提供唯讀介面訪問:

    def get_sex(self):

      return self.__sex

 

python基礎8之類的特性講解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.