類與對象的實戰案例解析 | Python從入門到精通:高階篇之二十五
封裝簡介
封裝是面向對象的三大特性之一。
封裝指的是隐藏對象中一些不希望被外部所通路到的屬性或方法。
我們根據上一節的代碼來看一下:
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學習站