python:get和set

weixin_33766168發表於2018-09-03

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的時間,一個點就調出來了。

相關文章