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__)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律