python 数据描述器实现类型检查

  

复制代码
class Genre:
    def __init__(self,title,mold):
        self.title=title
        self.mold=mold

    def __get__(self,instance,owner):
        print('__get__',self,instance,owner)
        return instance.__dict__[self.title]

    def __set__(self,instance,value):
        print('__set__',self,instance,value)
        if not isinstance(value,(self.mold,)):
            raise TypeError('value {} is not mold {}'.format(value,self.mold))
        instance.__dict__[self.title]=value


class P:
    name=Genre('name',str)

    def __init__(self,name:str,age:int):
        self.name=name
        self.age=age

p=P('bb',33)
print(p.name,p.age,)
print(p.__dict__)
复制代码

 

类中实现检查(inpsect)

复制代码
import inspect
class B:
    def __init__(self,name,age):
        self.name=name
        self.age=age
        self.gauge()

    def gauge(self):
        parameters=inspect.signature(self.__class__).parameters
        if parameters['name'].annotation != inspect._empty:
            if not isinstance(self.name,parameters['name'].annotation):
                raise TypeError('value {} not type {}'.format(self.name,parameters['name'].annotation))

        if parameters['age'].annotation != inspect._empty:
            if not isinstance(self.age,(parameters['age'].annotation,)):
                raise ValueError('value {} not genre {}'.format(self.age,parameters['age'].annotation))

b=B(33,22)
print(b.__dict__)
复制代码

 

复制代码
class B:
    def __init__(self,name:str,age:int):
        self.gauge(((name,str),(age,int)))
        self.name=name
        self.age=age

    @staticmethod
    def gauge(params):
        for k,v in params:
            if not isinstance(k,(v,)):
                raise ModuleNotFoundError('{} not {}'.format(k,v))

b=B('44',33)
复制代码

 

函数装饰器

复制代码
import inspect

def gauge(fn):
    def wrapper(self,name,age):
        parameters=inspect.signature(fn).parameters
        if parameters['name'] != inspect._empty:
            if not isinstance(name,parameters['name'].annotation):
                raise BlockingIOError('{} not {}'.format(name,parameters['name'].annotation))

        if parameters['age'] != inspect._empty:
            if not isinstance(age,parameters['age'].annotaion):
                raise OverflowError('{} not {}'.format(age,parameters['age'].annotation))
        return fn(self,name,age)
    return wrapper


class B:
    @gauge
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

b=B(22,33)
复制代码

 

 

复制代码
class Genre:
    def __init__(self,designator,mold):
        self.d=designator
        self.mold=mold

    def __get__(self,instance,owner):
        if instance is not None:
            return instance.__dict__[self.d]
        return self

    def __set__(self,instance,value):  # 只能实例进入
        if instance is not None:
            if isinstance(value,self.mold):
                instance.__dict__[self.d]=value
            else:
                raise ChildProcessError('{} not {}'.format(value,self.mold))
        else:
            print(8888888)

import inspect
def mold_assert(cls):
    parameters=inspect.signature(cls).parameters
    print(parameters)
    for k,v in parameters.items():
        print(k,v)
        if v.annotation != v.empty:
            setattr(cls,k,Genre(k,v.annotation))
    return cls

@mold_assert
class P:
    name=Genre('name',str)
    age=Genre('age',int)

    def __init__(self,name:str,age:int):
        self.name=name
        self.age=age

p=P('ss','m')
print(p.__dict__)
# P.name=55
print(P.__dict__)
复制代码

 

posted @   ascertain  阅读(98)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示