实例数据代理判断输入类型

本文通过实例演示了如何使用Python中的数据描述符来代理类的数据属性,并实现对属性类型的检查。首先介绍了基本的数据描述符代理过程,包括设置、获取和删除操作;接着展示了如何指定属性类型,确保赋值符合预期的数据类型。

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

# -*- coding:utf-8 -*-

# 数据描述符 代理 其他类数据属性
class typed:
    def __set__(self, instance, value):
        print("********set********")
        print(instance)     # 返回片p1对象 内存地址
        print(value)   # p1.name   name的值

    def __get__(self, instance, owner):
        print("*****get*****")
        print(instance)   # p1对象的内存地址
        print(owner)  # people类的内存地址

    def __delete__(self, instance):
        print("*****delete****")
        print(instance)   # p1对象内存地址


class people:
    name = typed()
    def __init__(self,name,age):
        self.name = name
        self.age = age

p1 = people("li",12)
print(p1.__dict__)  # {'age': 12}  name属性被代理
p1.name  # 触发typed的__get__方法
p1.age  # age 属性没有被代理
del p1.name  # name数据属性被代理  删除操作触发typed的__delete__方法





# 代理判断属性类型
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****")


class people:
    name = typed("name",str)
    age = typed("age",int)
    def __init__(self,name,age):
        self.name = name
        self.age = age

p1 = people("l",12)   # 类型不正确就会报错
print(p1.__dict__)  #  {'name': 'li', 'age': 12}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值