Python描述符

什么是描述符?

官方定义:通常,描述符是具有“绑定行为”的对象属性,其属性访问已被描述符协议中的方法覆盖。这些方法是__get__(),set()和 delete()。如果为对象定义了任何这些方法,则称其为描述符。

简单描述: 首先要有一个实现了__get__;set;__delete__方法的其中一种的类,如果一个类有个属性是前面的类的实例化对象,那么这个属性就是一个描述符。

	# 创建类:MyDescriptor
class MyDescriptor:
    # 添加 __get__ 方法
    def __get__(self, instance, owner):
        print('get called')
        return 'get'

    # 添加 __set__ 方法
    def __set__(self, instance, value):
        print('set called')

    # 添加 __delete__ 方法
    def __delete__(self, instance):
        print('delete called')

# 创建类:Foo
class Foo:
    # 创建一个实例对象调用上面的类 MyDescriptor
    attr = MyDescriptor()

描述符的作用?

描述符的作用是用来代理一个类的属性,需要注意的是描述符不能定义在被使用类的构造函数中,只能定义为类的属性,它只属于类的,不属于实例,我们可以通过查看实例和类的字典来确认这一点。

	# 创建类:MyDescriptor
class MyDescriptor:
    # 添加 __get__ 方法
    def __get__(self, instance, owner):
        print('get called')
        return 'get'

    # 添加 __set__ 方法
    def __set__(self, instance, value):
        print('set called')

    # 添加 __delete__ 方法
    def __delete__(self, instance):
        print('delete called')


# 创建类:Foo
class Foo:
    # 创建一个实例对象调用上面的类 MyDescriptor
    attr = MyDescriptor()


# 创建对象
f = Foo()
# 调用 attr
f.attr
# 设置attr数据
f.attr = 'python'
# 删除attr数据
del f.attr

描述符案例:限制属性

class Person(object):
    def __init__(self, num):
        self.num = num
        self.dict = {}

    def __get__(self, instance, owner):
        return self.dict.get(instance)

    def __set__(self, instance, value):
        if value < 0:
            raise ValueError('数据必须大于0')
        self.dict[instance] = value


class Student(object):
    age = Person(0)
    score = Person(0)

    def __init__(self, score, age):
        self.name = score
        self.age = age


s = Student(18, 100)
s.age = 18
s.score = 90
print(s.age)
print(s.score)

描述符案例:描述符完成@classmethod

class A(object):

    def __init__(self, item):
        self.item = item

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

    def __set__(self, instance, value):
        print(value)


class B(object):
    a = A(0)
    name = '小明'
    @classmethod
    def class_l(cls):
        print('姓名:', cls.name)


b = B()
b.class_l()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值