# mode: run
# tag: pyclass, getattr
"""
Python bypasses __getattribute__ overrides for some special method lookups.
"""
lookups = []
class PyClass(object):
"""
>>> del lookups[:]
>>> obj = PyClass()
>>> obj.test
'getattribute(test)'
>>> lookups
['getattribute(test)']
"""
def __getattribute__(self, name):
lookup = 'getattribute(%s)' % name
lookups.append(lookup)
return lookup
def __getattr__(self, name):
lookup = 'getattr(%s)' % name
lookups.append(lookup)
return lookup
def use_as_context_manager(obj):
"""
>>> del lookups[:]
>>> class PyCM(PyClass):
... def __enter__(self): return '__enter__(%s)' % (self is obj or self)
... def __exit__(self, *args): pass
>>> obj = PyCM()
>>> use_as_context_manager(obj)
'__enter__(True)'
>>> lookups
[]
"""
with obj as x:
pass
return x