天天看点

python 描述符类概述构成示例

概述

描述符类是Python中一种用于储存类属性值的对象

构成

根据定义,描述符类通常需要以下几种魔术方法:

  • __set__(self, instance, value)

  • __get__(self, instance, owner)

  • __delete__(self, instance)

  • __set_name__(self, owner, name)

__set__

函数

__set__

函数用于设置属性的值,值可以设置在描述符实例中,也可以设置在使用描述符实例的类实例中。其参数如下:

参数 意义
self 描述符实例
insntance 类实例对象
value 待设置的值

__get__

函数

__get__

函数用于获取属性的值。参数如下:

参数 意义
self 描述符实例
instance 类对象实例
owner 类对象

__delete__

函数

__delete__

函数用于删除已设置的属性,参数如下:

参数 意义
self 描述符实例
instance 类对象实例

__set_name__

函数

__set_name__

函数用于控制描述符对象绑定的类属性的名字。参数如下:

参数 意义
self 描述符实例
owner 类对象
name 属性名

示例

  • 属性值保存在描述符中
#!/usr/bin/env python3
# encoding: utf-8


class Grade:

    def __set__(self, instance, value):
        self.value = value

    def __get__(self, instance, owner):
        return self.value


class Exam:
    math_grade = Grade()


import pdb;pdb.set_trace()
exam = Exam()
exam.math_grade = 40
exam.math_grade


-> exam.math_grade = 40
(Pdb) s
--Call--
-> def __set__(self, instance, value):
(Pdb) args
self = <__main__.Grade object at 0x7f9749370a58>
instance = <__main__.Exam object at 0x7f9749383f98>
value = 40
...
...
(Pdb) exam.__dict__
{}
-> exam.math_grade
(Pdb) s
--Call--
-> def __get__(self, instance, owner):
(Pdb) args
self = <__main__.Grade object at 0x7f87c1827a58>
instance = <__main__.Exam object at 0x7f87c1827b70>
owner = <class '__main__.Exam'>           
  • 属性值保存在类实例中
#!/usr/bin/env python3
# encoding: utf-8


class Grade:

    def __set__(self, instance, value):
        instance.value = value

    def __get__(self, instance, owner):
        return instance.value


class Exam:
    math_grade = Grade()


import pdb;pdb.set_trace()
exam = Exam()
exam.math_grade = 40
exam.math_grade

(Pdb) exam.__dict__
{'value': 40}