# -*- coding: utf-8 -*-
"""Proxy class that forwards __special__ methods too.
"""
# pylint:disable=R0903
[docs]class proxy(object):
"Proxy class that forwards __special__ methods too."
__slots__ = ['_value']
def __init__(self, obj):
self._value = obj
####################################################################
# attribute control
def __getattr__(self, name):
return getattr(self._value, name)
def __setattr__(self, name, value):
if name in self.__slots__:
object.__setattr__(self, name, value)
else:
setattr(self._value, name, value)
#
####################################################################
def __repr__(self):
return 'proxy(%s)' % repr(self._value)
def __str__(self):
return str(self._value)
def __len__(self):
return len(self._value)
def __iter__(self):
return iter(self._value)
def __oct__(self):
return oct(self._value)
def __hex__(self):
return hex(self._value)
def __pos__(self):
return +self._value
def __hash__(self):
return self._value.__hash__()
def __nonzero__(self):
return self._value.__nonzero__()
def __call__(self, *args, **kwargs):
return self._value(*args, **kwargs)
####################################################################
# comparators
def __lt__(self, other):
return self._value < other
def __le__(self, other):
return self._value <= other
def __eq__(self, other):
return self._value == other
def __ne__(self, other):
return self._value != other
def __ge__(self, other):
return self._value >= other
def __gt__(self, other):
return self._value > other
####################################################################
# logical
def __and__(self, other):
return self._value and other
####################################################################
# numerical
def __add__(self, other):
return self._value + other
def __radd__(self, other):
return other + self._value
def __iadd__(self, other):
self._value += other
return self
def __abs__(self):
return abs(self._value)
def __div__(self, other):
return self._value / other
def __idiv__(self, other):
self._value /= other
return self
def __rdiv__(self, other):
return other / self._value
def __floordiv__(self, other):
return self._value // other
def __mul__(self, other):
return self._value * other
def __imul__(self, other):
self._value *= other
return self
def __rmul__(self, other):
return other * self._value
def __sub__(self, other):
return self._value - other
def __isub__(self, other):
self._value -= other
return self
def __rsub__(self, other):
return other - self._value
####################################################################
# binary
def __inv__(self):
return ~self._value
def __lshift__(self, other):
return self._value << other
def __rlshift__(self, other):
return other << self._value
def __mod__(self, other):
return self._value % other
def __neg__(self):
return -self._value
def __or__(self, other):
return self._value or other
def __pow__(self, other):
return self._value ** other
def __rpow__(self, other):
return other ** self._value
def __rshift__(self, other):
return self._value >> other
def __truediv__(self, other):
return self._value // other
def __xor__(self, other):
return self._value ^ other
def __contains__(self, other):
return other in self._value
def __delitem__(self, other):
del self._value[other]
def __getitem__(self, other):
return self._value[other]
def __repeat__(self, other):
return self._value * other
def __setitem__(self, other, v):
self._value[other] = v