类装饰器传参 描述符代理判断属性类型

本文介绍了一个使用Python描述符实现的属性类型检查器。通过定义一个名为`typed`的类,可以确保实例属性遵循预设的数据类型。此外,还提供了一个装饰器`deco`来简化该过程,并展示了一个具体的例子——`people`类,该类的`name`和`age`属性必须分别为字符串和整数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 代理判断属性类型
class typed:
    def __init__(self,key,exceted_tupe):
        self.key = key     # 把name传入
        self.exceted_type = exceted_tupe    # 需求类型

    def __set__(self, instance, value):
        print("********set********")
        if  not isinstance(value,self.exceted_type):   # 判断输入的类型是否正确
            raise TypeError("%s输入的不是%s类型"%(value,self.exceted_type))
        instance.__dict__[self.key] = value     # 把name添加到 实例属性字典

    def __get__(self, instance, owner):
        print("*****get*****")

    def __delete__(self, instance):
        print("*****delete****")


# 实例属性先传入装饰器 装饰器把数据传给描述符代理
def deco(**kwargs):
    def warpper(obj):

        for k,v in kwargs.items():
            setattr(obj,k,typed(k,v))  # typed()传给描述符 判断
                                       # setattr 给people添加属性
        return obj
    return warpper


@deco(name=str,age=int)
class people:
    def __init__(self,name,age):
        self.name = name
        self.age = age

p1 = people("ll",2)   # 类型不正确就会报错
print(p1.__dict__)  #  {'name': 'll', 'age': 2}

# 执行结果:
# ********set********
# ********set********
# {'name': 'll', 'age': 2}
# 两个属性调用两次set方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值