为什么不重写__getattribute__隐式使用魔术方法?

时间:2018-11-15 16:42:35

标签: python python-3.x field getattribute

我正在研究转发对象方法的方法,以修改其中的某些方法,而其余方法保持不变。

我认为,如果可以将__getitem__作为字段,那么应该也可以使用方括号和len,但显然不是:

class Wrapper:
    def __init__(self, x):
        self.__dict__['__wrapped_obj'] = x

    def __getattribute__(self, item):
        if item == '__dict__':
            return super().__getattribute__(item)
        print('They be gettin "{}"'.format(item))
        return self.__dict__['__wrapped_obj'].__getattribute__(item)

    def __setattribute__(self, item, v):
        print('They be settin "{}"'.format(item))
        return setattr(self.__dict__['__wrapped_obj'], item, v)

class Wrapper2:  # gives same results
    def __init__(self, x):
        for k in dir(x):
            if k not in ('__class__', ):
                setattr(self, k, getattr(x, k))
        self.__dict__['__wrapped_obj'] = x

a = Wrapper([])
a.append(5)
print(a.__getitem__(0))  # 5
len(a)                   # TypeError: object of type 'Wrapper' has no len()
a[0]                     # TypeError: 'Wrapper' object does not support indexing

那么Python在内部使用除项目__dict__之外的其他东西来查找魔术方法吗?

0 个答案:

没有答案