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}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值