|
Packit Service |
99d393 |
# mode: run
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
# __getattribute__ and __getattr__ special methods and subclasses.
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
cdef class boring:
|
|
Packit Service |
99d393 |
cdef readonly int boring_member
|
|
Packit Service |
99d393 |
cdef readonly int getattr_called
|
|
Packit Service |
99d393 |
cdef int getattribute_called
|
|
Packit Service |
99d393 |
def __init__(self):
|
|
Packit Service |
99d393 |
self.boring_member = 10
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
cdef class getattr_boring(boring):
|
|
Packit Service |
99d393 |
"""
|
|
Packit Service |
99d393 |
getattr does not override members.
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
>>> a = getattr_boring()
|
|
Packit Service |
99d393 |
>>> a.boring_member
|
|
Packit Service |
99d393 |
10
|
|
Packit Service |
99d393 |
>>> a.getattr_called
|
|
Packit Service |
99d393 |
0
|
|
Packit Service |
99d393 |
>>> print(a.resolved_by)
|
|
Packit Service |
99d393 |
getattr_boring
|
|
Packit Service |
99d393 |
>>> a.getattr_called
|
|
Packit Service |
99d393 |
1
|
|
Packit Service |
99d393 |
>>> a.no_such_member
|
|
Packit Service |
99d393 |
Traceback (most recent call last):
|
|
Packit Service |
99d393 |
AttributeError
|
|
Packit Service |
99d393 |
>>> a.getattr_called
|
|
Packit Service |
99d393 |
2
|
|
Packit Service |
99d393 |
"""
|
|
Packit Service |
99d393 |
def __getattr__(self,n):
|
|
Packit Service |
99d393 |
self.getattr_called += 1
|
|
Packit Service |
99d393 |
if n == 'resolved_by':
|
|
Packit Service |
99d393 |
return 'getattr_boring'
|
|
Packit Service |
99d393 |
elif n == 'getattr_boring':
|
|
Packit Service |
99d393 |
return True
|
|
Packit Service |
99d393 |
else:
|
|
Packit Service |
99d393 |
raise AttributeError
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
# currently fails, see #1793
|
|
Packit Service |
99d393 |
#class getattr_boring_py(getattr_boring):
|
|
Packit Service |
99d393 |
# __doc__ = getattr_boring.__doc__.replace(
|
|
Packit Service |
99d393 |
# 'getattr_boring()', 'getattr_boring_py()')
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
cdef class getattribute_boring(boring):
|
|
Packit Service |
99d393 |
"""
|
|
Packit Service |
99d393 |
getattribute overrides members.
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
>>> a = getattribute_boring()
|
|
Packit Service |
99d393 |
>>> a.getattribute_called
|
|
Packit Service |
99d393 |
1
|
|
Packit Service |
99d393 |
>>> a.boring_member
|
|
Packit Service |
99d393 |
Traceback (most recent call last):
|
|
Packit Service |
99d393 |
AttributeError
|
|
Packit Service |
99d393 |
>>> a.getattribute_called
|
|
Packit Service |
99d393 |
3
|
|
Packit Service |
99d393 |
>>> print(a.resolved_by)
|
|
Packit Service |
99d393 |
getattribute_boring
|
|
Packit Service |
99d393 |
>>> a.getattribute_called
|
|
Packit Service |
99d393 |
5
|
|
Packit Service |
99d393 |
>>> a.no_such_member
|
|
Packit Service |
99d393 |
Traceback (most recent call last):
|
|
Packit Service |
99d393 |
AttributeError
|
|
Packit Service |
99d393 |
>>> a.getattribute_called
|
|
Packit Service |
99d393 |
7
|
|
Packit Service |
99d393 |
"""
|
|
Packit Service |
99d393 |
def __getattribute__(self,n):
|
|
Packit Service |
99d393 |
self.getattribute_called += 1
|
|
Packit Service |
99d393 |
if n == 'resolved_by':
|
|
Packit Service |
99d393 |
return 'getattribute_boring'
|
|
Packit Service |
99d393 |
elif n == 'getattribute_boring':
|
|
Packit Service |
99d393 |
return True
|
|
Packit Service |
99d393 |
elif n == 'getattribute_called':
|
|
Packit Service |
99d393 |
return self.getattribute_called
|
|
Packit Service |
99d393 |
else:
|
|
Packit Service |
99d393 |
raise AttributeError
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
class getattribute_boring_py(getattribute_boring):
|
|
Packit Service |
99d393 |
__doc__ = getattribute_boring.__doc__.replace(
|
|
Packit Service |
99d393 |
'getattribute_boring()', 'getattribute_boring_py()')
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
cdef class _getattr:
|
|
Packit Service |
99d393 |
cdef readonly int getattr_called
|
|
Packit Service |
99d393 |
def __getattr__(self,n):
|
|
Packit Service |
99d393 |
self.getattr_called += 1
|
|
Packit Service |
99d393 |
if n == 'resolved_by':
|
|
Packit Service |
99d393 |
return '_getattr'
|
|
Packit Service |
99d393 |
elif n == '_getattr':
|
|
Packit Service |
99d393 |
return True
|
|
Packit Service |
99d393 |
elif n == 'getattr_called':
|
|
Packit Service |
99d393 |
# must only get here if __getattribute__ is overwritten
|
|
Packit Service |
99d393 |
assert 'getattribute' in type(self).__name__
|
|
Packit Service |
99d393 |
return self.getattr_called
|
|
Packit Service |
99d393 |
else:
|
|
Packit Service |
99d393 |
raise AttributeError
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
class getattr_py(_getattr):
|
|
Packit Service |
99d393 |
"""
|
|
Packit Service |
99d393 |
getattr is inherited.
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
>>> a = getattr_py()
|
|
Packit Service |
99d393 |
>>> a.getattr_called
|
|
Packit Service |
99d393 |
0
|
|
Packit Service |
99d393 |
>>> print(a.resolved_by)
|
|
Packit Service |
99d393 |
_getattr
|
|
Packit Service |
99d393 |
>>> a.getattr_called
|
|
Packit Service |
99d393 |
1
|
|
Packit Service |
99d393 |
>>> print(a._getattr)
|
|
Packit Service |
99d393 |
True
|
|
Packit Service |
99d393 |
>>> a.getattr_called
|
|
Packit Service |
99d393 |
2
|
|
Packit Service |
99d393 |
>>> a.no_such_member
|
|
Packit Service |
99d393 |
Traceback (most recent call last):
|
|
Packit Service |
99d393 |
AttributeError
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
# currently fails, see #1793
|
|
Packit Service |
99d393 |
#>>> a.getattr_called
|
|
Packit Service |
99d393 |
#3
|
|
Packit Service |
99d393 |
"""
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
cdef class _getattribute:
|
|
Packit Service |
99d393 |
cdef int getattribute_called
|
|
Packit Service |
99d393 |
def __getattribute__(self,n):
|
|
Packit Service |
99d393 |
self.getattribute_called += 1
|
|
Packit Service |
99d393 |
if n == 'resolved_by':
|
|
Packit Service |
99d393 |
return '_getattribute'
|
|
Packit Service |
99d393 |
elif n == '_getattribute':
|
|
Packit Service |
99d393 |
return True
|
|
Packit Service |
99d393 |
elif n == 'getattribute_called':
|
|
Packit Service |
99d393 |
return self.getattribute_called
|
|
Packit Service |
99d393 |
else:
|
|
Packit Service |
99d393 |
raise AttributeError
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
class getattribute_py(_getattribute):
|
|
Packit Service |
99d393 |
"""
|
|
Packit Service |
99d393 |
getattribute is inherited.
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
>>> a = getattribute_py()
|
|
Packit Service |
99d393 |
>>> a.getattribute_called
|
|
Packit Service |
99d393 |
1
|
|
Packit Service |
99d393 |
>>> print(a.resolved_by)
|
|
Packit Service |
99d393 |
_getattribute
|
|
Packit Service |
99d393 |
>>> a.getattribute_called
|
|
Packit Service |
99d393 |
3
|
|
Packit Service |
99d393 |
>>> print(a._getattribute)
|
|
Packit Service |
99d393 |
True
|
|
Packit Service |
99d393 |
>>> a.getattribute_called
|
|
Packit Service |
99d393 |
5
|
|
Packit Service |
99d393 |
>>> a.no_such_member
|
|
Packit Service |
99d393 |
Traceback (most recent call last):
|
|
Packit Service |
99d393 |
AttributeError
|
|
Packit Service |
99d393 |
>>> a.getattribute_called
|
|
Packit Service |
99d393 |
7
|
|
Packit Service |
99d393 |
"""
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
cdef class boring_getattribute(_getattribute):
|
|
Packit Service |
99d393 |
cdef readonly int boring_getattribute_member
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
cdef class boring_boring_getattribute(boring_getattribute):
|
|
Packit Service |
99d393 |
"""
|
|
Packit Service |
99d393 |
getattribute is inherited.
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
>>> a = boring_boring_getattribute()
|
|
Packit Service |
99d393 |
>>> a.getattribute_called
|
|
Packit Service |
99d393 |
1
|
|
Packit Service |
99d393 |
>>> a.boring_getattribute_member
|
|
Packit Service |
99d393 |
Traceback (most recent call last):
|
|
Packit Service |
99d393 |
AttributeError
|
|
Packit Service |
99d393 |
>>> a.getattribute_called
|
|
Packit Service |
99d393 |
3
|
|
Packit Service |
99d393 |
>>> a.boring_boring_getattribute_member
|
|
Packit Service |
99d393 |
Traceback (most recent call last):
|
|
Packit Service |
99d393 |
AttributeError
|
|
Packit Service |
99d393 |
>>> a.getattribute_called
|
|
Packit Service |
99d393 |
5
|
|
Packit Service |
99d393 |
>>> print(a.resolved_by)
|
|
Packit Service |
99d393 |
_getattribute
|
|
Packit Service |
99d393 |
>>> a.getattribute_called
|
|
Packit Service |
99d393 |
7
|
|
Packit Service |
99d393 |
>>> a.no_such_member
|
|
Packit Service |
99d393 |
Traceback (most recent call last):
|
|
Packit Service |
99d393 |
AttributeError
|
|
Packit Service |
99d393 |
>>> a.getattribute_called
|
|
Packit Service |
99d393 |
9
|
|
Packit Service |
99d393 |
"""
|
|
Packit Service |
99d393 |
cdef readonly int boring_boring_getattribute_member
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
class boring_boring_getattribute_py(boring_boring_getattribute):
|
|
Packit Service |
99d393 |
__doc__ = boring_boring_getattribute.__doc__.replace(
|
|
Packit Service |
99d393 |
'boring_boring_getattribute()', 'boring_boring_getattribute_py()')
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
cdef class boring_getattr(_getattr):
|
|
Packit Service |
99d393 |
cdef readonly int boring_getattr_member
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
cdef class boring_boring_getattr(boring_getattr):
|
|
Packit Service |
99d393 |
cdef readonly int boring_boring_getattr_member
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
cdef class getattribute_boring_boring_getattr(boring_boring_getattr):
|
|
Packit Service |
99d393 |
"""
|
|
Packit Service |
99d393 |
__getattribute__ is always tried first, then __getattr__, regardless of where
|
|
Packit Service |
99d393 |
in the inheritance hierarchy they came from.
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
>>> a = getattribute_boring_boring_getattr()
|
|
Packit Service |
99d393 |
>>> (a.getattr_called, a.getattribute_called)
|
|
Packit Service |
99d393 |
(1, 2)
|
|
Packit Service |
99d393 |
>>> print(a.resolved_by)
|
|
Packit Service |
99d393 |
getattribute_boring_boring_getattr
|
|
Packit Service |
99d393 |
>>> (a.getattr_called, a.getattribute_called)
|
|
Packit Service |
99d393 |
(2, 5)
|
|
Packit Service |
99d393 |
>>> a.getattribute_boring_boring_getattr
|
|
Packit Service |
99d393 |
True
|
|
Packit Service |
99d393 |
>>> (a.getattr_called, a.getattribute_called)
|
|
Packit Service |
99d393 |
(3, 8)
|
|
Packit Service |
99d393 |
>>> a._getattr
|
|
Packit Service |
99d393 |
True
|
|
Packit Service |
99d393 |
>>> (a.getattr_called, a.getattribute_called)
|
|
Packit Service |
99d393 |
(5, 11)
|
|
Packit Service |
99d393 |
>>> a.no_such_member
|
|
Packit Service |
99d393 |
Traceback (most recent call last):
|
|
Packit Service |
99d393 |
AttributeError
|
|
Packit Service |
99d393 |
>>> (a.getattr_called, a.getattribute_called)
|
|
Packit Service |
99d393 |
(7, 14)
|
|
Packit Service |
99d393 |
"""
|
|
Packit Service |
99d393 |
cdef int getattribute_called
|
|
Packit Service |
99d393 |
def __getattribute__(self,n):
|
|
Packit Service |
99d393 |
self.getattribute_called += 1
|
|
Packit Service |
99d393 |
if n == 'resolved_by':
|
|
Packit Service |
99d393 |
return 'getattribute_boring_boring_getattr'
|
|
Packit Service |
99d393 |
elif n == 'getattribute_boring_boring_getattr':
|
|
Packit Service |
99d393 |
return True
|
|
Packit Service |
99d393 |
elif n == 'getattribute_called':
|
|
Packit Service |
99d393 |
return self.getattribute_called
|
|
Packit Service |
99d393 |
else:
|
|
Packit Service |
99d393 |
raise AttributeError
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
# currently fails, see #1793
|
|
Packit Service |
99d393 |
#class getattribute_boring_boring_getattr_py(getattribute_boring_boring_getattr):
|
|
Packit Service |
99d393 |
# __doc__ = getattribute_boring_boring_getattr.__doc__.replace(
|
|
Packit Service |
99d393 |
# 'getattribute_boring_boring_getattr()', 'getattribute_boring_boring_getattr_py()')
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
cdef class getattr_boring_boring_getattribute(boring_boring_getattribute):
|
|
Packit Service |
99d393 |
"""
|
|
Packit Service |
99d393 |
__getattribute__ is always tried first, then __getattr__, regardless of where
|
|
Packit Service |
99d393 |
in the inheritance hierarchy they came from.
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
>>> a = getattr_boring_boring_getattribute()
|
|
Packit Service |
99d393 |
>>> (a.getattr_called, a.getattribute_called)
|
|
Packit Service |
99d393 |
(1, 2)
|
|
Packit Service |
99d393 |
>>> print(a.resolved_by)
|
|
Packit Service |
99d393 |
_getattribute
|
|
Packit Service |
99d393 |
>>> (a.getattr_called, a.getattribute_called)
|
|
Packit Service |
99d393 |
(2, 5)
|
|
Packit Service |
99d393 |
>>> a.getattr_boring_boring_getattribute
|
|
Packit Service |
99d393 |
True
|
|
Packit Service |
99d393 |
>>> (a.getattr_called, a.getattribute_called)
|
|
Packit Service |
99d393 |
(4, 8)
|
|
Packit Service |
99d393 |
>>> a._getattribute
|
|
Packit Service |
99d393 |
True
|
|
Packit Service |
99d393 |
>>> (a.getattr_called, a.getattribute_called)
|
|
Packit Service |
99d393 |
(5, 11)
|
|
Packit Service |
99d393 |
>>> a.no_such_member
|
|
Packit Service |
99d393 |
Traceback (most recent call last):
|
|
Packit Service |
99d393 |
AttributeError
|
|
Packit Service |
99d393 |
>>> (a.getattr_called, a.getattribute_called)
|
|
Packit Service |
99d393 |
(7, 14)
|
|
Packit Service |
99d393 |
"""
|
|
Packit Service |
99d393 |
cdef readonly int getattr_called # note: property will not be used due to __getattribute__()
|
|
Packit Service |
99d393 |
def __getattr__(self,n):
|
|
Packit Service |
99d393 |
self.getattr_called += 1
|
|
Packit Service |
99d393 |
if n == 'resolved_by':
|
|
Packit Service |
99d393 |
return 'getattr_boring_boring_getattribute'
|
|
Packit Service |
99d393 |
elif n == 'getattr_boring_boring_getattribute':
|
|
Packit Service |
99d393 |
return True
|
|
Packit Service |
99d393 |
elif n == 'getattr_called':
|
|
Packit Service |
99d393 |
return self.getattr_called
|
|
Packit Service |
99d393 |
else:
|
|
Packit Service |
99d393 |
raise AttributeError
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
# currently fails, see #1793
|
|
Packit Service |
99d393 |
#class getattr_boring_boring_getattribute_py(getattr_boring_boring_getattribute):
|
|
Packit Service |
99d393 |
# __doc__ = getattr_boring_boring_getattribute.__doc__.replace(
|
|
Packit Service |
99d393 |
# 'getattr_boring_boring_getattribute()', 'getattr_boring_boring_getattribute_py()')
|