========================== Python orientado a objetos ========================== .. testsetup:: class Circle: PI = 3.14 @classmethod def create_small_circle(cls): return cls(0.001) @staticmethod def angle_to_rad(grades): return 2 * Circle.PI * grades / 360 def __init__(self, radius): self.radius = radius def perimeter(self): return 2 * self.PI * self.radius def grow(self, inc): self.radius = self.radius + inc class FilledCircle(Circle): def area(self): return self.PI * (self.radius ** 2) class DoubleFilledCircle(FilledCircle): def area(self): rv = super().area() return 2 * rv Clases ====== En capítulos anteriores ----------------------- .. code:: python class Circle: PI = 3.14 def __init__(self, radius): self.radius = radius def perimeter(self): return 2 * self.PI * self.radius .. nextslide:: .. doctest:: >>> a_circle = Circle(3) >>> a_circle.radius 3 >>> a_circle.perimeter() 18.84 .. nextslide:: .. doctest:: >>> a_circle = Circle(3) >>> a_circle.radius 3 >>> a_circle.radius = 1 >>> a_circle.radius 1 >>> a_circle.perimeter() 6.28 Modificar propiedades --------------------- .. code:: python class Circle: PI = 3.14 def __init__(self, radius): self.radius = radius def perimeter(self): return 2 * self.PI * self.radius def grow(self, inc): self.radius = self.radius + inc .. nextslide:: .. doctest:: >>> a_circle = Circle(3) >>> a_circle.radius 3 >>> a_circle.grow(2) >>> a_circle.radius 5 Herencia -------- .. code:: class Nombreclasederivada(Nombreclasebase): expresión 1 expresión 2 . expresión N .. code:: python class FilledCircle(Circle): def area(self): return self.PI * (self.radius ** 2) .. doctest:: >>> a_filled_circle = FilledCircle(3) >>> a_filled_circle.radius 3 >>> a_filled_circle.perimeter() 18.84 >>> a_filled_circle.area() 28.26 Herencia: invocación ancestro ----------------------------- .. code:: python class DoubleFilledCircle(FilledCircle): def area(self): rv = super().area() return 2 * rv .. doctest:: >>> a_double_filled_circle = DoubleFilledCircle(3) >>> a_double_filled_circle.radius 3 >>> a_double_filled_circle.perimeter() 18.84 >>> a_double_filled_circle.area() 56.52 Herencia múltiple ----------------- .. code:: class Nombreclasederivada(Nombreclasebase1, Nombreclasebase2, ...): expresión 1 expresión 2 . expresión N Propiedades solo lectura ------------------------ .. code:: python class Feline: def __init__(self, name): self._name = name @property def name(self): return self._name.capitalize() .. testsetup:: * class Feline: def __init__(self, name): self._name = name @property def name(self): return self._name.capitalize() .. doctest:: >>> cat = Feline('garfield') >>> cat.name 'Garfield' >>> cat.name = 'Pluto' Traceback (most recent call last): File "", line 1, in cat.name = 'Pluto' AttributeError: can't set attribute Propiedades lectura/escritura ----------------------------- .. code:: python class Feline2: def __init__(self, name): self._name = name @property def name(self): return self._name.capitalize() @name.setter def name(self, value): self._name = value .. testsetup:: * class Feline2: def __init__(self, name): self._name = name @property def name(self): return self._name.capitalize() @name.setter def name(self, value): self._name = value .. doctest:: >>> cat = Feline2('garfield') >>> cat.name 'Garfield' >>> cat.name = 'Pluto' >>> cat.name 'Pluto' Representación -------------- .. code:: python class Feline: ... def __repr__(self): return "Feline(name={name})".format(name=repr(self._name)) def __str__(self): return self.name .. testsetup:: * class Feline: def __init__(self, name): self._name = name @property def name(self): return self._name.capitalize() def __repr__(self): return "Feline(name={name})".format(name=repr(self._name)) def __str__(self): return self.name .. doctest:: >>> cat = Feline('garfield') >>> cat Feline(name='garfield') >>> repr(cat) "Feline(name='garfield')" >>> print(cat) Garfield * ``__repr__``, formal, debug * ``__str__``, informal, print Métodos estáticos y de clase ---------------------------- .. code:: python class Circle: @classmethod def create_small_circle(cls): return cls(0.001) @staticmethod def angle_to_rad(grades): return 2 * Circle.PI * grades / 360 ... .. doctest:: >>> small_circle = Circle.create_small_circle() >>> small_circle.radius 0.001 .. doctest:: >>> Circle.angle_to_rad(90) 1.57 >>> Circle.angle_to_rad(180) 3.14 Comparación ----------- ``object.__eq__(self, other)`` Acceso atributos ---------------- ``object.__getattr__(self, name)`` ``object.__setattr__(self, name, value)`` ``object.__delattr__(self, name)`` Emulando contenedores --------------------- ``object.__len__(self)`` ``object.__contains__(self, item)`` ``object.__getitem__(self, key)`` ``object.__setitem__(self, key, value)`` ``object.__delitem__(self, key)`` ``object.__iter__(self)`` Emulando números ---------------- ``object.__add__(self, other)`` ``object.__sub__(self, other)``