"""
自定义一个类
1、对这个类创建的对象,进行属性限制,对象只能设置这个三个属性: title money data
2、通过相关机制对设置的属性类型进行限制,title只能设置字符串类型数据,money设置为int类型数据,data可以设置为任意类型
3、通过相关机制实现,data 属性不能进行删除
4、当money属性不存在时,查询出来的结果显示为0
5、类支持 obj[属性名] 这种语法获取属性值。
"""
def decorator(cls):
class MyCls(cls):
def __getitem__(self, item):
return getattr(self, item)
return MyCls
@decorator
class MyClass(object):
__slots__ = ['title', 'money', 'data']
def __init__(self, title, money, data):
self.title = title
self.money = money
self.data = data
def __setattr__(self, key, value):
if key == 'title':
if isinstance(value, str):
super().__setattr__(key, value)
else:
raise TypeError('title 只能设置为字符串,不能设置为其他类型')
elif key == 'money':
if isinstance(value, int):
super().__setattr__(key, value)
else:
raise TypeError('money 只能设置为int类型,不能设置为其他类型')
else:
super().__setattr__(key, value)
def __delattr__(self, item):
if item == 'data':
raise AttributeError('data属性不能被删除')
else:
super().__delattr__(item)
def __getattr__(self, item):
if item == 'money':
value = 0
return value
if __name__ == '__main__':
m = MyClass(title='allen', money=10, data='python')
del m.money
print(m['money'])