概述
描述符类是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}