【python】用描述符对实例属性做类型检查


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)



猜你喜欢

转载自blog.csdn.net/qq_38065133/article/details/82317827