2021-06-03 属性的访问机制:__getattr__,__getattribute__,__setattr__,__delattr__

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

你可能感兴趣的:(2021-06-03 属性的访问机制:__getattr__,__getattribute__,__setattr__,__delattr__)