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)