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__)
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号