美文网首页
python-描述符

python-描述符

作者: 小二哥很二 | 来源:发表于2022-03-12 17:45 被阅读0次

    什么是描述符?

    描述符:类中包含魔术方法:__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)       # ==><class '__main__.Person'>
            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-描述符

          本文链接:https://www.haomeiwen.com/subject/rafldrtx.html