封裝
將對象敏感的數(shù)據(jù)封裝在類的內(nèi)部,不讓外界直接訪問,而是通過當前類提供的set/get方法間接訪問數(shù)據(jù),此時就可以在set/get中添加限制條件進行訪問數(shù)據(jù)的控制。
封裝實現(xiàn)的步驟:
定義類型速梗,封裝零散數(shù)據(jù)【抽象的屬性】
[使用__slots__屬性,限制當前類的屬性列表? 為了代碼的統(tǒng)一性]
所有屬性私有化【屬性使用雙下劃線開頭襟齿,外界就不能直接訪問這樣的屬性了】
給每個屬性提供set/get方法镀琉,在方法中添加限制條件
class Person:
?????? def __init__(self,name,age):
????????????? self.__name = name
????????????? self.__age = age
?????? def set_name(self,name):
?????????????? self.__name = name
?????? def get_name(self):
????????????? return self.__name
?????? def set_age(self,age):
????????????? self.__age = age
?????? def get_age(self):
????????????? return self.__age
p = Person("問問",11)
print(p.get_name(),p.get_age())
p.set_name("好好")
p.set_age(33)
print(p.get_name(),p.get_age())
高級封裝
使用@property和@get_method.setter注解,來注釋set/get方法蕊唐,隱藏set/get方法的實現(xiàn)屋摔,讓方法的使用方式和屬性一致
偽方法重載:python中,默認不提供方法重載替梨,但是在高級封裝的過程中钓试,又出現(xiàn)了類似方法重載的代碼語法,所以~稱之為偽方法重載副瀑。
class Person:
?????? def __init__(self,name,age):
????????????? self.__name = name
????????????? self.__age = age
???????@property
???????def get_name(self):
???????????????? return self.__name
????????@get_name.setter
??????? def set_name(self,name):
????????????????? self.__name = name
?????????@property
?????????def get_age(self):
????????????????? return self.__age
?????????@get_age.setter
???????? def set_age(self,age):
?????????????????? self.__age = age
???????? def eat(self):
?????????????????? print("吃1234567")
p = Person("問問",11)
print(p.get_name,p.get_age)
p.set_name = "好好"
p.set_age = 33
print(p.get_name,p.get_age)
p.eat()
對方法的封裝
在封裝的過程中弓熏,除了封裝私有屬性,還可以針對一些底層的操作方法進行私有化糠睡,將方法封裝在類的內(nèi)部挽鞠,通過提供的一個公共方法來控制該方法的訪問權(quán)限
class MsgManagerment:
????????? def __sen_vilidata_code(self,code):
????????? print("發(fā)送驗證碼%s" % code)
????????? def sen_msg(self,type,code):
????????????????????if type == "1":
????????????????????????????? self.__sen_vilidata_code(code)
????????????????????????????? return 0
?????????????????? else:
????????????????????????????? return "沒有權(quán)限"
m = MsgManagerment()
re = m.sen_msg("2","12345789")
print(re)