[ Python魔法方法[属性]2 ]


1.getattr魔法方法 当读取这个属性不存在的时候, 你希望它做什么

class A:
    def __getattr__(self, name):
        print('getting')
        raise AttributeError

o = A()
print(o.test)

2.getattribute魔法方法 只要尝试读取属性都会被调用

class A:
    def __init__(self):
        self.data = 'abc'
        self.counter = 0

    def __getattribute__(self, name):
        if name == 'data':
            self.counter += 1  # 这里也会触发自己这个读取属性, 很容易产生无限递归
        raise super().__getattribute__(name)

o = A()
print(o.data)
print(o.data)
print(o.counter)

3.setattr魔法方法

class A:
    def __init__(self):
        self.data = 'abc'

    def __setattr__(self, name, val):
        self._attr[name] = val

o = A()
o.data = 'xyz'

4.get, set, delete

class A:
    def __init__(self):
        self.val = 0

    def __get__(self, name, value):
        return self.val 

    def __set__(self, name, value):
        self.val = value

class B:
    x = A()
o = B()
print(o.x)
o.x = 1
del o.x

5.slots魔法方法 白名单

class A:
    __slots__ = ['a','b']

o = A()
o.a = 1  # 没事
o.x = 1  # 报错

__contains__魔法方法

提供for x in xx循环方法

class A:
    def __contains__(self, value):
        return [for i in value]