forked from HectorRiquelme/lenguaje-python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
12-herencia multiple.py
132 lines (87 loc) · 3.61 KB
/
12-herencia multiple.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
'''
tema: 12 - herencia múltiple
A - introducción a herencia múltiple
B - prioridad en la herencia múltiple
ejercicio:
01 - figura geométrica
'''
'''
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
A - introducción a herencia múltiple
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
hasta ahora hemos visto como llevar a cabo la herencia desde una
clase padre hacia una clase hija, pero podrían darse escenarios
en los que se requiera que una clase hija hereda de las características
de más de una clase, a esto lo llamamos herencia múltiple
class ClaseHija( PadreUno, PadreDos):
pero, según vimos anteriormente, cuando tenemos una clase padre,
especificamos que usaremos el constructor de la clase padre mediante
el uso de la función super(), pero en este caso, si usamos la función super()
estaremos utilizando el constructor de la clase PadreUno o PadreDos?
class ClaseHija( PadreUno, PadreDos):
def __init__(selft,atributo_uno,atributo_dos):
super().__init__(atributo_uno) # no sabemos a cual padre
# le estamos pasando ese atributo
en este caso no podemos saber si estamos llamando al método constructor
del PAdreUno o PadreDos, entonces, para solucionar este problema es necesario
especificar la clase a la cual estamos invocando su constructor
class ClaseHija( PadreUno, PadreDos):
def __init__(self ,atributo_uno):
PadreUno.__init__(self, atributo_uno)
PadreDos.__init__(self, atributo_dos)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
B - prioridad en la herencia múltiple
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
al trabajar con herencia múltiple, es posible que se tengan métodos
con el mismo nombre en ambas clases padres, para estos casos será necesario
saber a cual clase va a tomar como prioridad antes de buscar el método en otra clase,
existe una función llamada "MRO" que sirve para indicar la prioridad de ejecución de
métodos de una clase
print( ClasehHija.mro() )
'''
#-----------------------------------------------
'''
::::::::::::::::::::::::::::::::::::::::::::::::
01 - figura geométrica
::::::::::::::::::::::::::::::::::::::::::::::::
'''
class FiguraGeometrica:
def __init__(self, alto, ancho) -> None:
self._alto = alto
self._ancho = ancho
def __str__(self):
return f'FiguraGeometrica [alto:{self._alto} - ancho:{self._ancho}]'
@property
def alto(self):
return self._alto
@alto.setter
def alto(self, alto) -> None:
self._alto = alto
@property
def ancho(self):
return self._ancho
@ancho.setter
def ancho(self, ancho) -> None:
self._ancho = ancho
class Color:
def __init__(self,color) -> None:
self._color=color
@property
def color(self):
return self._color
@color.setter
def color(self, color) -> None:
self._color=color
def __str__(self):
return f'Color [color:{self._color}]'
class Rectangulo(FiguraGeometrica,Color):
def __init__( self, alto, ancho, color) -> None:
FiguraGeometrica.__init__(self,alto,ancho)
Color.__init__( self, color)
def area(self):
return int(self.alto) * int(self.ancho)
def __str__(self):
return f'{FiguraGeometrica.__str__(self)}---{Color.__str__(self)}'
rectangulo = Rectangulo(4,3,"rojo")
print(rectangulo)
print(rectangulo.area())