# 如何使用描述符对实例属性做类型检查
class Descriptor(object):
def __get__(self, instance, owner):
print('in __get__', instance, owner)
def __set__(self, instance, value):
print('in __set__')
def __delete__(self, instance):
print('in __delete__')
class A(object):
x = Descriptor()
a = A()
a.x
A.x
a.x = 5
del a.x
class Attr(object):
def __init__(self, name, type_):
self.name = name
self.type_ = type_
def __get__(self, instance, owner):
return instance.__dict__[self.name]
def __set__(self, instance, value):
if not isinstance(value, self.type_):
raise TypeError('expected an %s' % self.type_)
instance.__dict__[self.name] = value
def __delete__(self, instance):
del instance.__dict__[self.name]
class Person(object):
name = Attr('name', str)
age = Attr('age', int)
height = Attr('height', float)
p = Person()
p.name = 'Bob'
# p.age = '17'
print(p.name)