blob: c3a9c8808237d3911340a9d76d033d2f505757d8 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
# 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
|