思路:
实现参数检查的本质是判断传入的参数是否符合形参定义的类型,也就是用isinstance进行判断.
...因此参数检查的不同实现的区别在于在哪些地方拦截传入的参数,来进行检查.
...上述实现的拦截地方:
在类初始化时,在对实例属性赋值之前拦截
使用装饰器,和inspect模块,在实例化之前进行参数检查
使用描述器,在初始化时对实例属性设置时...,触发描述器的__set__方法,在__set__方法中进行参数检查,再对其实例的类添加类属性
(如果添加在实例上,则会递归调用回到__set__方法)
使用装饰器获取参数注解...,给类添加有描述器的类属性,再通过描述器的方式进行参数检查