java裡面有一件事情很讓人崩潰,就是通過類裡面的public函式訪問類的私有屬性對外提供介面,從資料庫裡面讀出來的欄位包裝成物件之後,最重要的一件事情就是趕緊把欄位做成private的,然後開始寫public的get和set方法。這個過程很麻煩,但是卻很重要,小小的一對兒函式給程式設計師提供了無限的可能(這裡可以來腦補一個程式設計師大戰黑產的慘烈故事...),然而,這種東西也確實很煩人,假如你反射了一個有幾十個欄位做屬性的物件,這一堆get和set可是著實叫人抓狂,有些IDE甚至提供了自動生成get/set方法的功能(比如eclipse家族)。。。
那麼python裡面要怎樣處理這種情況呢?
先來看看最土的辦法:
class Test:
def __init__(self):
self.__key='init'
def get_key(self):
return self.__key
def set_key(self,key):
self.__key=key
看起來跟java沒什麼兩樣嘛......
然後注意,我要變型了:
class Student():
def __init__(self,name,age):
self.__name=name
self.__age=age
@property
def name(self):
print('reading name')
return self.__name
@name.setter
def name(self,name):
print('setting name')
self.__name=name
@property
def age(self):
print('reading age')
return self.__age
@age.setter
def age(self, age):
print('setting age')
self.__age = age
@age.deleter
def age(self):
print('deleting age')
del self.__age
def __str__(self):
return '姓名 '+self.__name+'年齡'+str(self.__age)
def my_print(obj):
print('-'*13)
print(obj)
print('-'*13)
if __name__ == '__main__':
stu = Student('小明',18)
my_print(stu)
my_print(str(stu.name)+'\n'+str(stu.age))
stu.age = 20
stu.name = '小強'
my_print(stu)
'''
#這個可以調deleter,開啟註釋跑跑看,也很有趣
del stu.age
my_print(stu)
'''
結果是這個樣子:
-------------
姓名 小明年齡18
-------------
reading name
reading age
-------------
小明
18
-------------
setting age
setting name
-------------
姓名 小強年齡20
-------------
Process finished with exit code 0
其實嘛,就是@property的使用嘍~(注意看那個被我註釋掉的del,這個很好玩,調的是deleter)
這裡節省的就是你呼叫getter和setter的時間,一個點就調出來了。