python 描述符的使用

创建student类有两个实例属性,分别写出get,set构造方法,每个set方法中都有重复的条件判断语句,这是可以使用描述符

class Student:
    def __init__(self,first_name,last_name):
        self.first_name = first_name
        self.last_name = last_name

    @property
    def first_name(self):
        return self.__first_name
    @first_name.setter
    def first_name(self,first_name):
        if not isinstance(first_name,str):
            raise Exception("First name is not a str")

        if len(first_name) == 0:
            raise Exception("First name is Empty")

        self.__first_name = first_name

    @property
    def last_name(self):
        return self.__last_name

    @last_name.setter
    def last_name(self, last_name):
        if not isinstance(last_name, str):
            raise Exception("Last name is not a str")

        if len(last_name) == 0:
            raise Exception("Last name is Empty")

        self.__last_name = last_name

描述符类,必须包含__set_name__方法和__set__或__get__或__del__方法

class RequiredString:

    def __init__(self,trim: bool):
        self.__trim = trim

    def __set_name__(self, owner, name):  # 将属性名传入描述符的类
        self.__property_name = name

    def __set__(self, instance, value): # set方法 内部进行逻辑判断
        if not isinstance(value,str):
            raise Exception(f"{self.__property_name} is not a String")  # 不是字符串抛出异常
        if self.__trim:
            value = value.strip()
            if len(value) == 0:
                raise Exception(f"{self.__property_name} is empty") # 字符串为空抛出异常

        instance.__dict__[self.__property_name] = value

    def __get__(self, instance, owner): # 描述符get方法
        if self.__property_name in instance.__dict__:
            return instance.__dict__[self.__property_name]

创建新的类,类变量指向描述符对象

class Student2:
    first_name = RequiredString(True)
    last_name = RequiredString(True)
    password = RequiredString(False)

实例化类对象,直接赋值给实例化对象的类变量

    student2 = Student2()
    student2.first_name = "QI"
    student2.last_name = "Zhang"

    student3 = Student2()
    student3.first_name = "Jarry"
    student3.last_name = "Zaho"


    password = Student2()
    password.password = "   "

    print(student2.first_name)
    print(student3.last_name)
    print(password.password)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值