封裝簡介
封裝是面向對象的三大特性之一。
封裝指的是隱藏對象中一些不希望被外部所訪問到的屬性或方法。
我們根據上一節的代碼來看一下:
class Dog:
'''
表示狗的類
'''
def __init__(self , name):
self.name = name
d = Dog('旺財')
d.name = '小黑'
print(d.name)
執行結果:
此時我們發現是可以修改的,所以是還沒有封裝。
如何隱藏一個對象中的屬性?
將對象的屬性名,修改為一個外部不知道的名字。
class Dog:
'''
表示狗的類
'''
def __init__(self , name):
self.hidden_name = name
def say_hello(self):
print('大家好,我是 %s'%self.hidden_name)
d = Dog('旺財')
d.say_hello()
執行結果:
我們對代碼做出修改:
d.name = '小黑'
#d.hidden_name = '小黑'
執行結果:
此時執行結果並沒有影響name屬性,但是我們修改一樣的屬性名稱,還是會改變,只是對比之前,比較好一點。
此時我們需要知道如何在外部獲取這些對象屬性了。
如何獲取(修改)對象中的屬性?
- 需要提供一個getter和setter方法使外部可以訪問到屬性
- getter 獲取對象中的指定屬性(get_屬性名)
- setter 用來設置對象的指定屬性(set_屬性名)
getter方法
class Dog:
'''
表示狗的類
'''
def __init__(self , name):
self.hidden_name = name
def say_hello(self):
print('大家好,我是 %s'%self.hidden_name)
def get_name(self):
'''
get_name()用來獲取對象的name屬性
'''
return self.hidden_name
d = Dog('旺財')
print(d.get_name())
執行結果:
setter方法我們對name屬性做出修改。
class Dog:
'''
表示狗的類
'''
def __init__(self , name):
self.hidden_name = name
def say_hello(self):
print('大家好,我是 %s'%self.hidden_name)
def get_name(self):
'''
get_name()用來獲取對象的name屬性
'''
return self.hidden_name
def set_name(self , name):
self.hidden_name = name
d = Dog('旺財')
# 調用setter來修改name屬性
d.set_name('小黑')
print(d.get_name())
執行結果:
此時我們來調用say_hello
class Dog:
'''
表示狗的類
'''
def __init__(self , name):
self.hidden_name = name
def say_hello(self):
print('大家好,我是 %s'%self.hidden_name)
def get_name(self):
'''
get_name()用來獲取對象的name屬性
'''
return self.hidden_name
def set_name(self , name):
self.hidden_name = name
d = Dog('旺財')
d.say_hello()
# 調用setter來修改name屬性
d.set_name('小黑')
d.say_hello()
print(d.get_name())
執行結果:
由以上代碼,我們可以瞭解到,使用封裝,確實增加了類的定義的複雜程度,但是它也確保了數據的安全性:
1.隱藏了屬性名,使調用者無法隨意的修改對象中的屬性。
2.增加了getter和setter方法,很好的控制的屬性是否是隻讀的,如果希望屬性是隻讀的,則可以直接去掉setter方法,如果希望屬性不能被外部訪問,則可以直接去掉getter方法。
3.使用setter方法設置屬性,可以增加數據的驗證,確保數據的值是正確的。
4.使用getter方法獲取屬性,使用setter方法設置屬性,可以在讀取屬性和修改屬性的同時做一些其他的處理。
我們使用age屬性來對數據驗證來進行處理。
class Dog:
'''
表示狗的類
'''
def __init__(self , name , age):
self.hidden_name = name
self.hidden_age = age
def say_hello(self):
print('大家好,我是 %s'%self.hidden_name)
def get_name(self):
'''
get_name()用來獲取對象的name屬性
'''
return self.hidden_name
def set_name(self , name):
self.hidden_name = name
def get_age(self):
return self.hidden_age
def set_age(self , age):
self.hidden_age = age
d = Dog('旺財',8)
# d.say_hello()
# 調用setter來修改name屬性
d.set_name('小黑')
#d.set_age(10)
d.set_age(-10)
# d.say_hello()
print(d.get_age())
執行結果:
此時負數依然會輸出,但是我們可以在方法中進行驗證輸出
def set_age(self , age):
if age > 0 :
self.hidden_age = age
執行結果:
可以在讀取屬性和修改屬性的同時做一些其他的處理:
def get_name(self):
'''
get_name()用來獲取對象的name屬性
'''
# print('用戶讀取了屬性')
return self.hidden_name
def set_name(self , name):
# print('用戶修改了屬性')
self.hidden_name = name
執行結果:
配套視頻課程,點擊這裡查看
獲取更多資源請訂閱Python學習站