Python描述符

现在试想一下我们有一个这样的场景。

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

我们希望在这里加入类型检查,name和gender都必须为字符串。

熟悉python的同学当然想到了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 !')

有没有发现一个很严重的问题,我们写了重复的逻辑,这样做是个十分不好的设计。我们希望自己写的类似于类型检查的逻辑可以复用。

下面就该我们描述符出场了,我们的代码变为了下面这样子。

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

我们看一下输出结果。

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 !

跟上面的代码实现的效果一样,但是我们实现的十分精简。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 先以这篇文章来看http://python.jobbole.com/81899/以下是对原文的cp,并对其分析,环...
    loveroot阅读 1,993评论 0 5
  • 原文地址:Descriptor HowTo Guide 描述符定义 一般来说,描述符是一个具有“binding b...
    大碗喝茶丶阅读 440评论 1 0
  • 实现了__set__(), __get__()或__delete__()的对象,且描述符属性只能定义在类级别。@p...
    蒋狗阅读 251评论 0 0
  • 最近心情莫名的低落 不知道自己留在北京干嘛 不想说话 不想听新歌 不想看新剧 不想认识新朋友 不想努力工作
    久斯阅读 271评论 0 0