1. 程式人生 > >python基礎8之類的特性講解

python基礎8之類的特性講解

attr blog 成員 私有方法 -s error 對象 構造 size

一、概述

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

  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 sayhi
the 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)
 
#輸出
22
19

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

三、定義私有屬性

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

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()方法獲取私有屬性sex
print(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)  #訪問私有屬性sex
d._dog__sex = "woman"  #修改私有屬性sex
print(d._dog__sex) #打印修改後的值
#輸出
man
woman

四、總結

  1. 定義私有屬性:self.__private_attr_name = private_attr_name
  2. 強制訪問私有屬性:對象名._類名__屬性名(d._dog__sex)
  3. 對外提供只讀接口訪問:

    def get_sex(self):

      return self.__sex

python基礎8之類的特性講解