python基礎8之類的特性講解
阿新 • • 發佈:2017-06-12
attr blog 成員 私有方法 -s error 對象 構造 size
一、概述
在上篇博客中我們已經講了一些關於類的知識,我們來回顧以下:
- 定義類(class dog(object))-> 實例化(d = dog()) -> 實例化對象(d)
- __init__()構造函數
- self.name = name 被稱為屬性、成員變量、字段
- 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
四、總結
- 定義私有屬性:self.__private_attr_name = private_attr_name
- 強制訪問私有屬性:對象名._類名__屬性名(d._dog__sex)
- 對外提供只讀接口訪問:
def get_sex(self):
return self.__sex
python基礎8之類的特性講解