一、重用父類方法 1 與繼承沒有關係的重用 指名道姓的使用 在子類里想用父類的方法,我們可以直接用父類名.方法名() >父類里方法有幾個參數就傳幾個參數 我們看起來是子類在調用父類的方法,但是實際上,這並沒有存在繼承關係 class A: def __init__(self,name,age): s ...
一、什麼是封裝
封裝的本身意思其實就和閉包函數一樣,就是把一個函數和變數全都包在一起,但其實這樣的說法不是很具體,就是一種很片面的解釋
二、為什麼要封裝
封裝數據的主要原因是:保護隱私
封裝方法的主要原因是:隔離複雜度(快門就是傻瓜相機為傻瓜們提供的方法,該方法將內部複雜的照相功能都隱藏起來了,只提供了一個快門鍵,就可以直接拍照)
提示:在編程語言里,對外提供的介面(介面可理解為了一個入口),就是函數,稱為介面函數,這與介面的概念還不一樣,介面代表一組介面函數的集合體。
三、如何封裝
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