Python orientado a objetos

Clases

En capítulos anteriores

class Circle:
    PI = 3.14

    def __init__(self, radius):
        self.radius = radius

    def perimeter(self):
        return 2 * self.PI * self.radius
>>> a_circle = Circle(3)
>>> a_circle.radius
3
>>> a_circle.perimeter()
18.84
>>> a_circle = Circle(3)
>>> a_circle.radius
3
>>> a_circle.radius = 1
>>> a_circle.radius
1
>>> a_circle.perimeter()
6.28

Modificar propiedades

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
>>> a_circle = Circle(3)
>>> a_circle.radius
3
>>> a_circle.grow(2)
>>> a_circle.radius
5

Herencia

class Nombreclasederivada(Nombreclasebase):
    expresión 1
    expresión 2
    .
    expresión N
class FilledCircle(Circle):
    def area(self):
        return self.PI * (self.radius ** 2)
>>> 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

class DoubleFilledCircle(FilledCircle):
    def area(self):
        rv = super().area()
        return 2 * rv
>>> 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

class Nombreclasederivada(Nombreclasebase1, Nombreclasebase2, ...):
    expresión 1
    expresión 2
    .
    expresión N

Propiedades solo lectura

class Feline:
    def __init__(self, name):
        self._name = name

    @property
    def name(self):
        return self._name.capitalize()
>>> cat = Feline('garfield')
>>> cat.name
'Garfield'
>>> cat.name = 'Pluto'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    cat.name = 'Pluto'
AttributeError: can't set attribute

Propiedades lectura/escritura

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
>>> cat = Feline2('garfield')
>>> cat.name
'Garfield'
>>> cat.name = 'Pluto'
>>> cat.name
'Pluto'

Representación

class Feline:
    ...
    def __repr__(self):
        return "Feline(name={name})".format(name=repr(self._name))

    def __str__(self):
        return self.name
>>> 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

class Circle:

    @classmethod
    def create_small_circle(cls):
        return cls(0.001)

    @staticmethod
    def angle_to_rad(grades):
        return 2 * Circle.PI * grades / 360
    ...
>>> small_circle = Circle.create_small_circle()
>>> small_circle.radius
0.001
>>> 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)