描述符

描述符(get,set,delete__)

1、描述符本质就是一个新式类,在这个新式类中,至少实现了 get()、set()、delete() 中的一个,这也被称为描述符协议
get():调用一个属性时触发
set():为一个属性赋值时触发
delete():采用del删除属性时触发

class Foo:      #Foo是新式类,它实现了三种方法,这个类就被称作一个描述符
    def __get__(self, instance, owner):
        pass
    def __set__(self, instance, value):
        pass
    def __delete__(self, instance):
        pass

2、描述符的作用是用来代理另外一个类的属性的(必须把描述符定义成这个类的类属性,不能定义到构造函数中)

class Foo:     		#描述符Foo
    def __get__(self, instance, owner):
        print('get方法')
    def __set__(self, instance, value):
        print('set方法')
        instance.__dict__['name']=value     #instance 代表实例,该语句操作实例字典
    def __delete__(self, instance):
        print('delete方法')

class People:
# name 被Foo 代理,所以在对name进行操作实际是操作Foo的三种方法
    name = Foo()	
    def __init__(self,name):	#name被Foo类代理
        self.name = name

p1 = People('hah')
print(p1.name)
p1.name = 'bbb'
del p1.name

3、描述符分两种:
数据描述符:至少实现了 get() 和 set()

class Foo:     		
    def __get__(self, instance, owner):
        print('get方法')
    def __set__(self, instance, value):
        print('set方法')

非数据描述符:没有实现 set()

class Foo:     		
    def __get__(self, instance, owner):
        print('get方法')

注意事项:
1、描述符本身应该定义为新式类,被代理的类也应该是新式类
2、必须把描述符定义成这个类的类属性,不能定义到构造函数中去
3、要严格遵循该优先级,优先级由高到低分别是:

  • 类属性
  • 数据描述符
  • 实例属性
  • 非数据描述符
  • 找不到的属性触发 getattr()
class Foo:      #Foo是新式类,它实现了三种方法,这个类就被称作一个描述符
    def __get__(self, instance, owner):
        print('--->get方法')
    def __set__(self, instance, value):
        print('--->set方法')
        #instance.__dict__['name']=value     #instance 代表实例,该语句操作实例字典
    def __delete__(self, instance):
        print('--->delete方法')

class People:
    name = Foo()

#print(People.name)

#类属性 > 数据描述符
# People.name = 1
# print(People.__dict__)
# print(People.name)


#数据描述符 > 实例属性
print(People.__dict__)
b1 = People()
print(b1.name)
b1.name = 1
del b1.name
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值