1.面向對象的特征——封裝
封裝”就是將抽象得到的數據和行為(或功能)相結合,形成一個有機的整體(即類);封裝的目的是增強安全性和簡化編程,使用者不必了解具體的實現細節,而只是要通過外部接口,一特定的訪問權限來使用類的成員。
將對象敏感的數據封裝在類的內部,不讓外界直接訪問,而是通過當前類提供的set/get方法間接訪問數據,此時就可以在set/get中添加限制條件進行訪問數據的控制。
1.類的屬性
類由屬性和方法組成,類的屬性是對數據的封裝,而類的方法是對類的行為的封裝。
類的屬性按使用范圍分為共有屬性和私有屬性。具體地,在Python實現面向對象的編程思想的時候,封裝在類中的屬性可以分為兩種:數據類的屬性和數據對象的屬性(也可以成為數據類的成員變量和屬于對象的成員變量),其中,這兩種成員變量又各自分為共有成員變量和私有成員變量。
2.類的成員變量和對象的成員變量
類的成員變量定義在類中,和類的成員函數在同一縮進等級。而對象的成員變量定義在init(self)成員函數中,和init(self)函數下的變量和語句在同一等級。通俗地講,類的成員變量屬于類,共類的所有對象和類本身所共有,也就是說所有的類的對象和類只有一份這樣的變量。而對象的成員變量屬于類的對象本身,每個對象都有一份,而且各個對象之間互不影響。
3.封裝實現的步驟:
定義類型,封裝零散數據【抽象的屬性】
[使用__slots__屬性,限制當前類的屬性列表à為了代碼的統一性]
所有屬性私有化【屬性使用雙下劃綫開頭,外界就不能直接訪問這樣的屬性了】
給每個屬性提供set/get方法,在方法中添加限制條件
1.class Users(object):
? ? ?def__init__(self,name):
? ? ? ?self.name = name
u = Users("tom")
print(u.name)
u.name ="jerry"
print(u.name)
2.封裝私有化,提供set/get函數
class Person(object):
def__init__(self,name):
? ? ? ?self.__name = name
def set_name(self,name):
? ? ?self.__name=name
def ?get_name(self):
? ? ?return ?self.__name
?p = Person("shuke")
print(p.get_name())
p.set_name("jerry")
print(p.get_name())
3.高級封裝
使用@property和@get_method.setter注解,來注釋set/get方法,隱藏set/get方法的實現,讓方法的使用方式和屬性一致
class Computer(object):
? ? ? ? ?def__init__(self,name):
? ? ? ? ?self.__name = name
@property
def ?get_name(self):
returnself.__name
@get_name.setter
def set_name(self,name):
? ? ? ?self.__name = name
c = Computer("dell")
print(c.get_name)
c.set_name ="hp"
print(c.get_name)
4.實現對方法的封裝
在封裝的過程中,除了封裝私有屬性,還可以針對一些底層的操作方法進行私有化,將方法封裝在類的內部,通過提供的一個公共方法來控制該方法的訪問權限
class Animals(object):
? ? ? ? ?def__init__(self,name,age):
? ? ? ? self.__name = name
? ? ? ? ?self.__age = age
@property
def name(self):
? ? ? return self.__name
@name.setter
def name(self,n):
? ? ? self.__name = n
@property
def age(self):
? ? ? ?returnself.__age
@age.setter
def age(self,a):
? ? ? ?if (a >=0)and(a <=20):
? ? ? ? ? ? ? ? ?self.__age = a
? ? ? else:
? ? ? ? ? ? ? ? ?print("年齡輸入不合法..")
a =Animals("tiger",10)
a.name ="monkey"
print(a.name)
a.age =22
print(a.age)
封裝的作用:一個是保護隱私,一個是降低程序復雜度,提高程序健壯性