# -*- coding:utf-8 -*-
# 数据描述符 代理 其他类数据属性
class typed:
def __set__(self, instance, value):
print("********set********")
print(instance) # 返回片p1对象 内存地址
print(value) # p1.name name的值
def __get__(self, instance, owner):
print("*****get*****")
print(instance) # p1对象的内存地址
print(owner) # people类的内存地址
def __delete__(self, instance):
print("*****delete****")
print(instance) # p1对象内存地址
class people:
name = typed()
def __init__(self,name,age):
self.name = name
self.age = age
p1 = people("li",12)
print(p1.__dict__) # {'age': 12} name属性被代理
p1.name # 触发typed的__get__方法
p1.age # age 属性没有被代理
del p1.name # name数据属性被代理 删除操作触发typed的__delete__方法
# 代理判断属性类型
class typed:
def __init__(self,key,exceted_tupe):
self.key = key # 把实例name传入
self.exceted_type = exceted_tupe # 需求类型
def __set__(self, instance, value):
print("********set********")
if not isinstance(value,self.exceted_type): # 判断输入的类型是否正确
raise TypeError("%s输入的不是%s类型"%(value,self.exceted_type))
instance.__dict__[self.key] = value # 把name添加到 实例属性字典
def __get__(self, instance, owner):
print("*****get*****")
def __delete__(self, instance):
print("*****delete****")
class people:
name = typed("name",str)
age = typed("age",int)
def __init__(self,name,age):
self.name = name
self.age = age
p1 = people("l",12) # 类型不正确就会报错
print(p1.__dict__) # {'name': 'li', 'age': 12}