仅剩的如果 发表于 2023-4-13 01:47:34

浅谈对属性描述符__get__、__set__、__delete__的理解

1、属性描述符的基础介绍

1.1 何为属性描述符?

属性描述符是一种Python语言中的特殊对象,用于定义和控制类属性的行为。属性描述符可以通过定义__get__、__set__、__delete__方法来控制属性的读取、赋值和删除操作。
通过使用属性描述符,可以实现对属性的访问控制、类型检查、计算属性等高级功能。
如果一个对象定义了这些方法中的任何一个,它就是一个描述符。
看完上面的文字描述,是不是感觉一头雾水,没关系,接下来通过一个简单的案例来讲解属性描述符的作用。
1.2 为什么需要属性描述符?

假设我们现在要做一个成绩管理系统,在定义学生类时,我们可能这样写:
class Student(object):

    def __init__(self, name, age, cn_score, en_score):
      self.name = name
      self.age = age
      self.cn_score = cn_score
      self.en_score = en_score

    def __str__(self):
      return "Student: {},age:{},cn_score:{},en_score:{}".format(self.name, self.age, self.cn_score, self.en_score)


xiaoming = Student("xiaoming", 18, 70, 55)
print(xiaoming)1.2.1 init函数中做参数校验

因为python是动态语言类型,不像静态语言那样,可以给参数指定类型,所以在传参时,无法得知参数是否正确。比如,当cn_score传入的值为字符串时,程序并不会报错。这个时候,一般就会想到对传入的参数做校验,当传入的参数不符合要求时,抛错。
class Student(object):

    def __init__(self, name, age, cn_score, en_score):
      self.name = name
      if not isinstance(age, int):
            raise TypeError("age must be int")
      if age <= 0:
            raise ValueError("age must be greater than 0")
      self.age = age

      if not isinstance(cn_score, int):
            raise TypeError("cn_score must be int")
      if 0 <= cn_score <= 100:
            raise ValueError("cn_score must be between 0 and 100")
      self.cn_score = cn_score

      if not isinstance(en_score, int):
            raise TypeError("en_score must be int")
      if 0 <= en_score <= 100:
            raise ValueError("en_score must be between 0 and 100")
      self.en_score = en_score

    def __str__(self):
      return "Student: {},age:{},cn_score:{},en_score:{}".format(self.name, self.age, self.cn_score, self.en_score)


xiaoming = Student("xiaoming", -1, 70, 55)
print(xiaoming)参考链接:
【案例讲解】Python为什么要使用描述符?
[属性描述符:__get__函数、__set__函数和__delete_函数](

来源:https://www.cnblogs.com/huageyiyangdewo/p/17311733.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 浅谈对属性描述符__get__、__set__、__delete__的理解