Saltar al contenido

composición y agregación en python

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *