Python描述符

現(xiàn)在試想一下我們有一個(gè)這樣的場(chǎng)景。

class Person:
  def __init__(self, name, gender):
      self.name = name
      self.gender = gender

我們希望在這里加入類型檢查,name和gender都必須為字符串。

熟悉python的同學(xué)當(dāng)然想到了property。那我們的代碼就變成了這樣子。

class Person:
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        if isinstance(name, str):
            self._name = name
        else:
            raise AttributeError('name must be a string !')

    @property
    def gender(self):
        return self._gender

    @gender.setter
    def gender(self, gender):
        if isinstance(gender, int):
            self._gender = gender
        else:
            raise AttributeError('gender must be a string !')

有沒有發(fā)現(xiàn)一個(gè)很嚴(yán)重的問題,我們寫了重復(fù)的邏輯,這樣做是個(gè)十分不好的設(shè)計(jì)。我們希望自己寫的類似于類型檢查的邏輯可以復(fù)用。

下面就該我們描述符出場(chǎng)了,我們的代碼變?yōu)榱讼旅孢@樣子。

class StringField:
    def __get__(self, instance, owner):
        return self.data

    def __set__(self, instance, value):
        if not isinstance(value, str):
            raise ValueError('need string !')
        self.data = value

    def __delete__(self):
        ...


class Person:
    name = StringField()
    gender = StringField()


if __name__ == '__main__':
    p = Person()
    p.name = 'Tom'
    print(p.name)
    p.name = 123

我們看一下輸出結(jié)果。

Tom
Traceback (most recent call last):  File "/Users/shizhentao/PythonProjects/flask-demo/test.py", line 30, in <module>
    p.name = 123  File "/Users/shizhentao/PythonProjects/flask-demo/test.py", line 8, in __set__
    raise ValueError('need string !')
ValueError: need string !

跟上面的代碼實(shí)現(xiàn)的效果一樣,但是我們實(shí)現(xiàn)的十分精簡(jiǎn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 先以這篇文章來看http://python.jobbole.com/81899/以下是對(duì)原文的cp,并對(duì)其分析,環(huán)...
    loveroot閱讀 2,037評(píng)論 0 5
  • 原文地址:Descriptor HowTo Guide 描述符定義 一般來說,描述符是一個(gè)具有“binding b...
    大碗喝茶丶閱讀 467評(píng)論 1 0
  • 實(shí)現(xiàn)了__set__(), __get__()或__delete__()的對(duì)象,且描述符屬性只能定義在類級(jí)別。@p...
    蔣狗閱讀 285評(píng)論 0 0
  • 最近心情莫名的低落 不知道自己留在北京干嘛 不想說話 不想聽新歌 不想看新劇 不想認(rèn)識(shí)新朋友 不想努力工作
    久斯閱讀 282評(píng)論 0 0

友情鏈接更多精彩內(nèi)容