在某项目中,我们实现了一些类,并希望能像静态类型语言那样(C,C++,Java)对它们的实例属性做类型检查
p = Person()
p.name = 'Bob' #必须是str
p.age = 18 #必须是int
p.height = 1.83 #必须是float
要求:
1.可以对实例变量名指定类型
2.赋予不正确类型时抛出异常
使用描述符来实现需要类型检查的属性:
分别实现__get__,__set__,__delete__方法,在__set__内使用isinstance函数做类型检查
class Typed:
def __init__(self,key,expected_type): #构造函数接收所传入的参数和参数类型
self.key=key
self.expected_type=expected_type
def __get__(self, instance, owner):
print('get方法')
return instance.__dict__[self.key] #从底层字典获取值
def __set__(self, instance, value):
print('set方法')
if not isinstance(value,self.expected_type): #类型判断
raise TypeError('%s 传入的类型不是%s' %(self.key,self.expected_type)) #格式化抛出异常
instance.__dict__[self.key]=value #修改底层字典
def __delete__(self, instance):
print('delete方法')
instance.__dict__.pop(self.key)
class People:
name=Typed('name',str) #p1.__set__() self.__set__(),触发描述符__set__方法,设置参数类型传给构造函数
age=Typed('age',int) #p1.__set__() self.__set__()
salary = Typed('salary',float) #p1.__set__() self.__set__()
def __init__(self,name,age,salary):
self.name=name
self.age=age
self.salary=salary
# p1=People('alex','13',13.3) #类型有误,报错
p1=People('alex',13,13.3)
print(p1.__dict__)
print(p1.name)
p1.name='egon'
print(p1.__dict__)
del p1.name
print(p1.__dict__)
print(p1.name) #相应的键值对已在底层字典中删除了,报错