class T:
pass
t = T()
t.__dict__['x'] = 'ooo' #等价于 t.x = 'ooo', 添加实例属性x
print(t.x)
===============================
ooo
class Attr:
def __init__(self, key, type_):
self.key = key
self.type_ = type_
def __set__(self, instance, value): # instance是传进来的person实例 value是设置的值
print('in __set__')
if not isinstance(value, self.type_):
raise TypeError('must be %s' % self.type_)
instance.__dict__[self.key] = value
def __get__(self, instance, cls): #cls是传进来的person类
print('in __get__', instance, cls)
return instance.__dict__[self.key]
def __delete__(self, instance):
print('in __del__', instance)
del instance.__dict__[self.key]
class Person:
# 这个name是类属性,但是由于没有设置实例属性,
# 它会往上查找到name,
# 但实际上是创建了实例属性 self.name的,
# 因为Attr里面instance.__dict__[self.key] = value,这个是添加实例属性的
name = Attr('name', str)
age = Attr('age', int)
# def __init__(self):
# self.name = Attr('name', str)
# self.age = Attr('age', int)
p = Person()
p.name = 'ssso'
p.age = 32
#print(Person.name)
【python】用描述符对实例属性做类型检查
猜你喜欢
转载自blog.csdn.net/qq_38065133/article/details/82317827
今日推荐
周排行