Blame tests/run/__getattribute__.pyx

Packit 562c7a
# mode: run
Packit 562c7a
Packit 562c7a
# __getattribute__ and __getattr__ special methods for a single class.
Packit 562c7a
Packit 562c7a
Packit 562c7a
cdef class just_getattribute:
Packit 562c7a
    """
Packit 562c7a
    >>> a = just_getattribute()
Packit 562c7a
    >>> a.called
Packit 562c7a
    1
Packit 562c7a
    >>> a.called
Packit 562c7a
    2
Packit 562c7a
    >>> a.bar
Packit 562c7a
    'bar'
Packit 562c7a
    >>> a.called
Packit 562c7a
    4
Packit 562c7a
    >>> a.invalid
Packit 562c7a
    Traceback (most recent call last):
Packit 562c7a
    AttributeError
Packit 562c7a
    >>> a.called
Packit 562c7a
    6
Packit 562c7a
    """
Packit 562c7a
    cdef readonly int called
Packit 562c7a
    def __getattribute__(self,n):
Packit 562c7a
        self.called += 1
Packit 562c7a
        if n == 'bar':
Packit 562c7a
            return n
Packit 562c7a
        elif n == 'called':
Packit 562c7a
            return self.called
Packit 562c7a
        else:
Packit 562c7a
            raise AttributeError
Packit 562c7a
Packit 562c7a
Packit 562c7a
cdef class just_getattr:
Packit 562c7a
    """
Packit 562c7a
    >>> a = just_getattr()
Packit 562c7a
    >>> a.called
Packit 562c7a
    0
Packit 562c7a
    >>> a.called
Packit 562c7a
    0
Packit 562c7a
    >>> a.foo
Packit 562c7a
    10
Packit 562c7a
    >>> a.called
Packit 562c7a
    0
Packit 562c7a
    >>> a.bar
Packit 562c7a
    'bar'
Packit 562c7a
    >>> a.called
Packit 562c7a
    1
Packit 562c7a
    >>> a.invalid
Packit 562c7a
    Traceback (most recent call last):
Packit 562c7a
    AttributeError
Packit 562c7a
    >>> a.called
Packit 562c7a
    2
Packit 562c7a
    """
Packit 562c7a
    cdef readonly int called
Packit 562c7a
    cdef readonly int foo
Packit 562c7a
    def __init__(self):
Packit 562c7a
        self.foo = 10
Packit 562c7a
    def __getattr__(self,n):
Packit 562c7a
        self.called += 1
Packit 562c7a
        if n == 'bar':
Packit 562c7a
            return n
Packit 562c7a
        else:
Packit 562c7a
            raise AttributeError
Packit 562c7a
Packit 562c7a
Packit 562c7a
cdef class both:
Packit 562c7a
    """
Packit 562c7a
    >>> a = both()
Packit 562c7a
    >>> (a.called_getattr, a.called_getattribute)
Packit 562c7a
    (0, 2)
Packit 562c7a
    >>> a.foo
Packit 562c7a
    10
Packit 562c7a
    >>> (a.called_getattr, a.called_getattribute)
Packit 562c7a
    (0, 5)
Packit 562c7a
    >>> a.bar
Packit 562c7a
    'bar'
Packit 562c7a
    >>> (a.called_getattr, a.called_getattribute)
Packit 562c7a
    (1, 8)
Packit 562c7a
    >>> a.invalid
Packit 562c7a
    Traceback (most recent call last):
Packit 562c7a
    AttributeError
Packit 562c7a
    >>> (a.called_getattr, a.called_getattribute)
Packit 562c7a
    (2, 11)
Packit 562c7a
    """
Packit 562c7a
    cdef readonly int called_getattribute
Packit 562c7a
    cdef readonly int called_getattr
Packit 562c7a
    cdef readonly int foo
Packit 562c7a
    def __init__(self):
Packit 562c7a
        self.foo = 10
Packit 562c7a
Packit 562c7a
    def __getattribute__(self,n):
Packit 562c7a
        self.called_getattribute += 1
Packit 562c7a
        if n == 'foo':
Packit 562c7a
            return self.foo
Packit 562c7a
        elif n == 'called_getattribute':
Packit 562c7a
            return self.called_getattribute
Packit 562c7a
        elif n == 'called_getattr':
Packit 562c7a
            return self.called_getattr
Packit 562c7a
        else:
Packit 562c7a
            raise AttributeError
Packit 562c7a
Packit 562c7a
    def __getattr__(self,n):
Packit 562c7a
        self.called_getattr += 1
Packit 562c7a
        if n == 'bar':
Packit 562c7a
            return n
Packit 562c7a
        else:
Packit 562c7a
            raise AttributeError