import math

class OrderedPair:
    """Coordinate pair (x, y) with absVal and label.
    get_x() and get_y() added so subclasses can read coordinates."""

    def __init__(self, x=0.0, y=0.0):
        """Default + two-parameter constructor via default params."""
        print("...OrderedPair constructor...")
        self._x       = x
        self._y       = y
        self._abs_val = self._compute_abs_val()
        self._label   = "O" if (x == 0.0 and y == 0.0) else "P"

    @classmethod
    def from_ordered_pair(cls, orig):
        """Copy constructor."""
        print("...OrderedPair copy constructor (classmethod)...")
        instance        = cls(orig._x, orig._y)
        instance._label = orig._label + "_copy"
        return instance

    def __str__(self):
        return self._label + "(" + str(self._x) + ", " + str(self._y) + ")"

    # getters
    def get_x(self):       return self._x
    def get_y(self):       return self._y
    def get_abs_val(self): return self._abs_val
    def get_label(self):   return self._label

    # setter
    def set_label(self, lbl):
        print("...set_label...")
        self._label = lbl

    # utility methods
    def _compute_abs_val(self):
        print("...compute_abs_val...")
        return math.sqrt(self._x ** 2 + self._y ** 2)

    def transpose(self):
        print("...transpose...")
        self._x, self._y = self._y, self._x
        self._abs_val = self._compute_abs_val()

#end class OrderedPair
