Classe Projecte =============== Disseny de la classe Projecte ----------------------------- Volem representar un projecte, compost de diferents tasques. A tal fi, al fitxer :download:`tasques.py` disposeu de la implementació de la classe :py:class:`Tasca`, que representa una feina a fer, especificada tot seguit: .. py:module:: tasques .. py:class:: Tasca(descr, durada) Construeix una tasca amb el nom i la durada donats. .. rubric:: Atributs públics .. py:attribute:: descr Descripció de la la tasca (string) .. py:attribute:: durada Durada de la tasca (instància de la classe :py:class:`datetime.timedelta`) A més a més, la classe :py:class:`Tasca` disposa de l'operació `str`, que permet transformar-la en un string mostrant-ne la descripció i la durada. .. py:module:: projectes **Es demana** que, al mòdul :py:mod:`projectes` (fitxer :file:`projectes.py`), hi implementeu la classe :py:class:`Projecte`, seguint la seva especificació: .. py:class:: Projecte(nom) Construeix un projecte amb el nom donat, inicialment sense cap tasca. .. rubric:: Atributs públics .. py:attribute:: nom Nom del projecte (string) .. rubric:: Mètodes .. py:method:: afegir(t) Afegeix una nova tasca `t`, que ha de ser una instància de la classe :py:class:`Tasca`, com a darrera tasca a realitzar del projecte (la de menor prioritat). .. py:method:: duracio() Retorna la duració del projecte, calculada a partir de les durades de totes les tasques implicades. El valor retornat ha de ser un objecte de la classe :py:class:`datetime.timedelta`. .. rubric:: Operacions +---------------+--------------------------------------------------------------------+ | Operació | Resultat | +===============+====================================================================+ | ``len(proj)`` | Retorna el nombre de tasques del projecte ``proj`` | +---------------+--------------------------------------------------------------------+ | ``proj[i]`` | Retorna la tasca (instància de la classe :py:class:`Tasca`) | | | ``i``-èssima del projecte ``proj``. | | | El valor ``i`` ha de satisfer ``0 <= i < len(proj)`` | +---------------+--------------------------------------------------------------------+ **Implementació** A més dels atributs públics, la classe :py:class:`Projecte` ha de tenir un atribut privat on s'emmagatzemin les tasques. Com que les tasques s'afegeixen sempre al final, el més còmode és que aquest atribut sigui una llista d'instàncies de :py:class:`Tasca`. Exemple de funcionament de la classe: .. literalinclude:: test-projectes.txt :language: python :end-before: --fi-enunciat Disposeu dels jocs de proves al fitxer :download:`test-projectes.txt`. La classe ProjecteFixat ----------------------- .. py:module:: projectesf Al mòdul :py:mod:`projectesf` (fitxer :file:`projectesf.py`) implementeu-hi la classe :py:class:`ProjecteFixat`, que es deriva per herència de la classe :py:class:`Projecte` i representa un projecte fixat en una data concreta. L'especificació de la classe :py:class:`ProjecteFixat` és la següent: .. py:class:: ProjecteFixat(nom, data) Construeix un projecte amb el nom i la data d'inici donats, inicialment sense cap tasca. La data ha de ser una instància de la classe :py:class:`datetime.date`. .. rubric:: Atributs públics Els que s'hereten més un d'addicional: .. py:attribute:: data_inici Data d'inici del projecte (instància de la classe :py:class:`datetime.date`). .. rubric:: Mètodes Els que s'hereten més un d'addicional: .. py:method:: data_final() Retorna la data de finalització del projecte, calculada a partir de la seva data d'inici i la duració del projecte. Cal tenir en compte que la jornada laboral és de 8 hores. Per simplificar, suposarem que tots els dies són feiners (es treballa de dilluns fins a diumenge). .. rubric:: Operacions A part de les que s'hereten, cap d'addicional. Exemple de funcionament de la classe: .. literalinclude:: test-projectesf.txt :language: python :end-before: --fi-enunciat Disposeu dels jocs de proves al fitxer :download:`test-projectesf.txt`. .. note:: Disposeu d'una solució de l'exercici als fitxers :download:`projectes.py` i :download:`projectesf.py`.