Python对象描述符

描述符是干啥的:

    描述符本质上就是一个新式类,至少实现了    __get__() , __set__(), __delete__(), 这3个方法当中的一个。

    描述符是用来代理另外一个类的属性的, 必须把描述符定义在另外一个类的属性当中,不能定义在构造函数里。

    __get__调用属性触发

   __set__设置属性触发

   __delete__删除属性触发

 

 

 

 

描述符分为2种:

    第一种,至少实现了 __get__() 和 __set__()

    第二种,没有实现 __set__()

 

 

基本描述

class Foo:

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


    def __get__(self, instance, owner):
        print('__get__')

    def __delete__(self, instance):
        print('__delete__')

class Demo:
    x=Foo()

    def __init__(self,x):
        self.x=x  # self.x被代理, 设置 self.x=x,触发 Foo的 __set__()方法


d=Demo(10)
d.x   # 触发 Foo的 __get__()方法
del d.x # 触发 Foo的 __delete__()方法

 

利用描述符来限定对象属性的类型

class Typed:

    def __init__(self,key,type):
        self.key=key
        self.type=type

    def __get__(self, instance, owner):
        print('__get__')
        return instance.__dict__[self.key]

    def __set__(self, instance, value):
        print('__set__')
        if type(value) is self.type:
            instance.__dict__[self.key]=value
        else:
            raise TypeError('属性【%s】的类型必须是%s'%(self.key,self.type))


    def __delete__(self, instance):
        print('__delete__')
        del instance.__dict__[self.key]


class People:

    name=Typed('name',str)
    age=Typed('age',int)
    salary=Typed('salary',float)

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


p=People('jack',23,1234)
print(p.name)

 

posted @ 2020-11-27 22:49  leungqingyun  阅读(78)  评论(0)    收藏  举报