Àlbum de música =============== En aquest exercici implementareu classes destinades a representar informació relacionada amb àlbums de música. .. py:module:: pessa_musical La classe `PeçaMusical` ----------------------- Implementeu la classe :py:class:`~pessa_musical.PeçaMusical` que representa una peça de música. Deseu aquesta classe al fitxer :file:`pessa_musical.py`. L'especificació d'aquesta classe és la següent: .. py:class:: PeçaMusical(titol, durada) Retorna una peça a partir dels paràmetres de títol i durada. **Atributs:** .. py:attribute:: titol El títol de la peça musical (classe :py:class:`str`) .. py:attribute:: durada La durada de la peça musical (instància de la classe :py:class:`datetime.timedelta`) Aquesta classe ha de suportar l'operació de comparació per igualtat. Dues peces són iguals si coincideixen els títols i les durades: +--------------------------+---------------------------------+ | Operació | Resultat | +==========================+=================================+ | ``p1 == p2`` | ``p1`` és igual a ``p2`` | +--------------------------+---------------------------------+ Per exemple: .. literalinclude:: test-pessa_musical.txt :language: pycon :end-before: --fi-enunciat Trobareu més exemples d'ús d'aquesta classe al fitxer :download:`test-pessa_musical.txt` i una solució al fitxer :download:`pessa_musical.py`. .. py:module:: album_base La classe `AlbumBase` --------------------- En el mòdul :file:`album_base.py` dissenyeu la classe :py:class:`AlbumBase` que permet de representar àlbums de música. La seva especificació és la següent: .. py:class:: AlbumBase(titol, autor, nombre_peces) Retorna un nou àlbum de música amb el títol i autors donats, preparat per a emmagatzemar *nombre_peces* cançons. **Atributs**: .. py:attribute:: titol Títol de l'àlbum (:class:`str`) .. py:attribute:: autor Nom de l'autor de l'àlbum (:class:`str`) Aquesta classe ha de suportar les operacions següents: +--------------------------+------------------------------------+ | Operació | Resultat | +==========================+====================================+ | ``len(a)`` | retorna el nombre de peces l'àlbum | +--------------------------+------------------------------------+ | ``a[i]`` | retorna la ``i``-èssima | | | peça de l'àlbum ``a``, | | | essent ``0<=i`_. Vegeu, per exemple: .. literalinclude:: test-titols_llargs.txt :language: pycon :end-before: --fi-enunciat Trobareu més exemples d'ús d'aquesta classe al fitxer :download:`test-titols_llargs.txt` i una solució al fitxer :download:`titols_llargs.py`. .. py:module:: album La classe `Album` ----------------- Al fitxer :file:`album.py`, dissenyeu la classe :py:class:`Album` que es deriva per herència de la classe :py:class:`~albumbase.AlbumBase` i que l'estén afegint-li informació de l'any de publicació. A més a més, li afegeix també el mètode :py:meth:`~Album.durada`: .. py:class:: Album(titol, autor, any_publicacio, nombre_peces) **Atributs**: .. py:attribute:: any_publicacio Any de publicació de l'àlbum **Mètodes**: .. py:method:: durada() Retorna la durada total de l'àlbum Per dissenyar aquesta classe heu de tenir en compte les observacions següents: #. L'atribut :py:attr:`~Album.any_publicacio` s'inicialitza en construir la instància a partir del nom del paràmetre de mateix nom. #. Per a implementar el mètode :py:meth:`~Album.durada`, cal sumar la durada de totes les cançons de l'àlbum. Recomanem fer les funcions predefinidies dels iteradors, fent ús del paràmetre opcional :`start` de la funció :py:func:`sum`. Per exemple: .. literalinclude:: test-album.txt :language: pycon :end-before: --fi-enunciat Trobareu més exemples d'ús d'aquesta classe al fitxer :download:`test-album.txt` i una solució a :download:`album.py`.