什么是描述符?
描述符:类中包含魔术方法:
__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
网友评论