python-描述符

什么是描述符?

描述符:类中包含魔术方法:__get__,__set__,__delete__其中一个,那么这个类就是描述符类。

一个类中的成员的值是另一个描述符类的对象()
那么当对这个类中的成员进行操作时,可以理解为就是对另一个对象的操作,即__name里面有get、set、delete三个方法
自动触发操作

描述符的定义

第一种定义方式

class Human:
    __name = "Lily"

    def __get__(self, instance, owner):
        # print(self)        # ==><__main__.Human object at 0x000001B7BF15B710>
        # print(instance)    # ==><__main__.Person object at 0x000001B7BF165FD0>
        # print(owner)       # ==>
        return self.__name

    def __set__(self, instance, value):
        self.__name = value

    def __delete__(self, instance):
        del self.__name


class Person:
    name = Human()


res = Person()
print(f'赋值set之前的姓名是:{res.name}')
res.name = '丽萨'
print(f'赋值set之后的姓名是:{res.name}')
del res.name
print(f'删除赋值之后的姓名是初始值:{res.name}')

结果:
赋值set之前的姓名是:Lily
赋值set之后的姓名是:丽萨
删除赋值之后的姓名是初始值:Lily

第二种定义方式

class Student:
    __score = '88'

    def getscore(self):
        print('我是获取分数')
        return self.__score

    def setscore(self, value):
        print(f'set的分数是{value}')

    def delscore(self):
        print('我删除了分数')

    # 在 property 函数中指定对应的三个方法,
    score = property(getscore, setscore, delscore)

res = Student()
print(res.score)
res.score = '66'
del res.score

结果:
我是获取分数
88
set的分数是66
我删除了分数

第三种定义方式

class Student:
    __score = None

    @property
    def score(self):
        print('我是魔术方法get')
        return self.__score

    @score.setter
    def score(self, value):
        print(f'我是魔术方法set:{value}')
        self.__score = value

    @score.deleter
    def score(self):
        print(f'我是魔术方法deleter:{self.score}')
        del self.__score


res = Student()
print(res.score)
res.score = '89'
del res.score

结果:
我是魔术方法get
None
我是魔术方法set:89
我是魔术方法get
我是魔术方法deleter:89

你可能感兴趣的:(python-描述符)