一、什么是封裝
封裝的本身意思其實就和閉包函式一樣,就是把一個函式和變數全都包在一起,但其實這樣的說法不是很具體,就是一種很片面的解釋
二、為什么要封裝
封裝資料的主要原因是:保護隱私
封裝方法的主要原因是:隔離復雜度(快門就是傻瓜相機為傻瓜們提供的方法,該方法將內部復雜的照相功能都隱藏起來了,只提供了一個快門鍵,就可以直接拍照)
提示:在編程語言里,對外提供的介面(介面可理解為了一個入口),就是函式,稱為介面函式,這與介面的概念還不一樣,介面代表一組介面函式的集合體,
三、如何封裝
1.在類里面封裝其實就是:
- 隱藏屬性:通過 __變數名來隱藏
- 隱藏方法:通過 __方法名來隱藏
2.隱藏屬性:是為了資料的安全
- 隱藏nmae屬性的例子
class Person:
def __init__(self,name,age):
self.__name=name
self.age=age
p=Person('xichen',18)
print(p.age)# 這個時候我們實體化出來的物件是訪問不到類init里的__name屬性的,
如何訪問被隱藏的屬性
通過在列里面寫一個訪問被隱藏的屬性的介面
class Person:
def __init__(self,name,age):
self.__name=name
self.age=age
def get_name(self):
# print(self.__name)
return '[----%s-----]'%self.__name
p=Person('xichen',18)
print(p.age)
p=Person('xichen',18)
print(p.get_name())
通過物件名._類名_被隱藏的屬性名
print(p._Person__name)
3.隱藏方法:為了隔離復雜度
-
在繼承中,父類如果不想讓子類覆寫自己的方法,可以將方法定義為私有的
-
方法的隱藏和屬性的隱藏式一樣的
-
這里的隱藏的方法不想我們的隱藏的屬性一樣可以有方法去用,隱藏的方法是用不了的
class Person:
def __init__(self,name,age):
self.__name=name
self.__age=age
def __speak(self):
print('6666')
四、property裝飾器
1 property裝飾器有什么用
它可以把方法包裝成資料屬性
class Person:
def __init__(self,name,height,weight):
self.name=name
self.height=height
self.weight=weight
@property # 使用語法糖的方式 通過property裝飾器進行裝飾
def bmi(self):
return self.weight/(self.height**2)
p=Person('xc',1.82,75)
print(p.bmi) # 使用查看物件屬性的方式 查看方法的回傳值
# print(p.bmi()) # 錯誤的使用方法
# p.bmi = 123 # 只能查看,不能進行修改
22.6421929718633
2 property之setter和deleter
使用property裝飾器將方法包裝成資料屬性后,是無法進行修改的
只要通過property裝飾器中的方法 .setter,這樣就可以修改了
#Python交流學習Q群:711312441
class Person:
def __init__(self,name,height,weight):
self.__name=name
self.__height=height
self.__weight=weight
@property
def name(self):
return '[我的名字是:%s]'%self.__name
#用property裝飾的方法名.setter,這樣就可以修改了
@name.setter
def name(self,new_name):
# if not isinstance(new_name,str):
if type(new_name) is not str:
raise Exception('改不了')
if new_name.startswith('sb'):
raise Exception('不能以sb開頭')
self.__name=new_name
p=Person('xc',1.82,70)
# 按照屬性進行呼叫
print(p.name) # 呼叫property裝飾器后的方法 name,變為一個屬性
# 按照屬性進行呼叫,并修改
p.name='pppp' # 呼叫property.setter裝飾器后的方法,可以進行修改
# 改不了,直接拋例外
# p.name=999
# p.name='sb_xxx'
只要通過property裝飾器中的方法 .deleter,就可以洗掉了
一般沒有這個需求,
class Person:
def __init__(self, name, height, weight):
self.__name = name
self.__height = height
self.__weight = weight
@property
def name(self):
return '[我的名字是:%s]' % self.__name
# 用property裝飾的方法名.setter,這樣就可以修改了
@name.setter
def name(self, new_name):
# if not isinstance(new_name,str):
if type(new_name) is not str:
raise Exception('改不了')
if new_name.startswith('sb'):
raise Exception('不能以sb開頭')
self.__name = new_name
p = Person('xc', 1.82, 70)
# python學習交流群:711312441
# 按照屬性進行呼叫
print(p.name) # 呼叫property裝飾器后的方法 name,變為一個屬性
# 按照屬性進行呼叫,并修改
p.name = 'pppp' # 呼叫property.setter裝飾器后的方法,可以進行修改
# 改不了,直接拋一例外
# p.name=999
# p.name='sb_xxx'
# 洗掉name,會呼叫property.deleter裝飾的方法
del p.name
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/541063.html
標籤:其他
上一篇:Python重用父類方法
下一篇:MyBatis配置決議
