我正在研究转发对象方法的方法,以修改其中的某些方法,而其余方法保持不变。
我认为,如果可以将__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__
之外的其他东西来查找魔术方法吗?