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]