cdef class pair:

    cdef object _first
    cdef object _second

    property first:
        def __get__(self):
            return self._first
        def __set__(self, value):
            self._first = value
        def __del__(self):
            self._first = None

    property second:
        def __get__(self):
            return self._second
        def __set__(self, value):
            self._second = value
        def __del__(self):
            self._second = None

    #

    def __cinit__(self, first=None, second=None):
        self.first  = first
        self.second = second

    def __repr__(self):
        clsname = self.__class__.__name__
        return "%s(%r,%r)" % (clsname, self.first, self.second)

    def __str__(self):
        clsname = self.__class__.__name__
        return "%s(%s,%s)" % (clsname, self.first, self.second)

    #

    def __reduce__(self):
        return type(self), (), self.__getstate__()

    def __getstate__(self):
        return (self.first, self.second)

    def __setstate__(self, state):
        self.first, self.second = state

