Presta atención ya que en este escrito vas a hallar el arreglo que buscas.Este escrito ha sido aprobado por nuestros expertos para garantizar la calidad y veracidad de nuestro contenido.
Solución:
Si entiendo correctamente, la agregación frente a la composición se trata de las responsabilidades de un objeto para sus miembros (por ejemplo, si elimina una instancia, ¿también elimina sus miembros?).
Principalmente, dependerá mucho de la implementación. Por ejemplo, para crear una clase A que reciba una instancia de la clase B (agregación), podría escribir lo siguiente:
class B(object): pass
class A(object):
def __init__(self, b):
self.b = b
b = B()
a = A(b)
Pero como precaución, no hay nada integrado en Python que le impida pasar algo más, por ejemplo:
a = A("string") # still valid
Si desea crear la instancia de B dentro del constructor de A (composición), puede escribir lo siguiente:
class A(object):
def __init__(self):
self.b = B()
O bien, podría inyectar la clase en el constructor y luego crear una instancia, así:
class A(object):
def __init__(self, B):
self.b = B()
Aparte, al menos en su primer ejemplo y posiblemente en el segundo, está configurando B en la definición de clase de B, no en una instancia de la misma:
class A(object):
def __init__(self, B):
self.B = B
>>> a = A()
>>> a.B # class definition
>>> a.B() # which you can make instances of
<__main__.B instance at 0x02860990>
Entonces, terminas con una instancia de A que apunta a la definición de clase de B, que estoy bastante seguro de que no es lo que buscas. Aunque, en general, eso es mucho más difícil de hacer en otros idiomas, por lo que entiendo si ese fue uno de los puntos de confusión.
La composición y la agregación son formas especializadas de Asociación. Mientras que la Asociación es una relación entre dos clases sin reglas.
Composición
En composición, una de las clases se compone de una o más instancias de otras clases. En otras palabras, una clase es contenedor y otra clase es contenido y si elimina el objeto contenedor, todos sus objetos de contenido también se eliminan.
Ahora veamos un ejemplo de composición en Python 3.5. Clase Employee
es contenedor y clase Salary
es contenido
class Salary:
def __init__(self,pay):
self.pay=pay
def get_total(self):
return (self.pay*12)
class Employee:
def __init__(self,pay,bonus):
self.pay=pay
self.bonus=bonus
self.obj_salary=Salary(self.pay)
def annual_salary(self):
return "Total: " + str(self.obj_salary.get_total()+self.bonus)
obj_emp=Employee(100,10)
print (obj_emp.annual_salary())
Agregación
La agregación es una forma débil de composición. Si elimina el contenido del objeto contenedor, los objetos pueden vivir sin el objeto contenedor.
Ahora veamos un ejemplo de agregación en Python 3.5. otra vez clase Employee
es contenedor y clase Salary
es contenido
class Salary:
def __init__(self,pay):
self.pay=pay
def get_total(self):
return (self.pay*12)
class Employee:
def __init__(self,pay,bonus):
self.pay=pay
self.bonus=bonus
def annual_salary(self):
return "Total: " + str(self.pay.get_total()+self.bonus)
obj_sal=Salary(100)
obj_emp=Employee(obj_sal,10)
print (obj_emp.annual_salary())
# Aggregation is NOT exclusive
class BaseChapter:
'''
We can use this BaseChapter in any book, like in OpenBook.
'''
def __init__(self, name):
self.name = name
self.subject = None
self.content = None
return
class OpenBook:
def __init__(self, isbn):
self.isbn = isbn
self.chapters = list()
def add_chapter(self, obj):
# This constrain dont have correlation with composition/aggregation
if isinstance(obj, BaseChapter):
self.chapters.append(obj)
else:
raise TypeError('ChapterError')
# .. but Composition is Exclusive
# Example:
class MyBook:
class MyChapter:
'''
This MyChapter can be used only by MyBook
'''
def __init__(self, name, subject):
self.name = name
self.subject = subject
self.title = None
self.content = None
self.techincal_refs = list()
return
def __init__(self, isbn):
self.isbn = isbn
self.chapters = list()
def add_chapter(self, obj):
# This constrain dont have correlation with composition/aggregation
# what is important here is MyChapter can be used only by MyBook
# a outside object cant create a instance of MyChapter
if isinstance(obj, self.MyChapter):
self.chapters.append(obj)
else:
raise TypeError('ChapterError')
.. y sí podemos hacerlo mejor como
class MyBook:
class MyChapter(BaseChapter):
'''
This MyChapter can be used only by MyBook,
but now is based in BaseChapter.
But you knhow, python dont create problems if you still want
create a instance of MyChapter in other 'Books'.
But when you see this code you will think, This class is exclusive
to MyBook.
'''
def __init__(self, name):
super().__init__(name)
self.subject = None
self.title = None
self.content = None
self.techincal_refs = list()
return
def __init__(self, nib):
self.nib = nib
self.chapters = list()
def add_chapter(self, obj):
# This constrain dont have correlation with composition/agregation
# what is important here is MyChapter can be used only by MyBook
if isinstance(obj, self.MyChapter):
self.chapters.append(obj)
else:
raise TypeError('ChapterError')
Recuerda dar difusión a esta crónica si si solucionó tu problema.