1. 实例属性的增删查改 (与类属性无关)
a. getattribute(self, item): 获取属性的相关方法,一定要有返回值
class MyClass:
def __getattr__(self, item):
pass
def __getattribute__(self, item):
if item == "name1":
return "cherry"
else:
return super().__getattribute__(item)
def __setattr__(self, key, value):
# 设置属性
if key == "name":
if isinstance(value, str):
super().__setattr__(key, value)
else:
raise ValueError("name 的属性只能是字符串")
else:
super().__setattr__(key, value)
def __delattr__(self, item):
pass
obj=MyClass()
obj.name1 = "cherry1"
print(obj.name1)
# print(obj.name)
练习题:自定义一个类
1、对这个类创建的对象,进行属性限制,对象只能设置这个三个属性: title money data
2、通过相关机制对设置的属性类型进行限制,title只能设置字符串类型数据
money设置为int类型数据 data可以设置为任意类型
3、通过相关机制实现,data 属性不能进行删除
4、当money设置的值少于0时,确保查询出来的值为0,"""
class Homework:
__slots__ = ['title', 'money', 'data']
def __init__(self, title, money, data):
self.title = title
self.money = money
self.data = data
def __getattribute__(self, item):
if item == "money":
value = object.__getattribute__(self, item)
if value < 0:
return 0
else:
return object.__getattribute__(self, item)
def __delattr__(self, item):
if item == 'data':
raise AttributeError("data 属性不能被删除")
else:
object.__delattr__(self, item)
def __setattr__(self, key, value):
if key == "title":
if isinstance(value, str):
return object.__setattr__(self, key, value) # 使用object 时,需要传入self
else:
raise TypeError('title 的属性只能是字符串')
elif key == "money":
if isinstance(value, int):
return super().__setattr__(key, value) # 使用super() 时,不需要传入self
else:
raise TypeError('money 的属性只能是字符串')
else:
object.__setattr__(self, key, value)
def __getattr__(self, item):
if item not in ['title', 'money', 'data']:
print("属性 {} 不存在".format(item))
return None