Un trait peut accéder aux attributs et méthodes de l'objet sans que ces attributs et méthodes soient définis. Il faut donc espérer que la classe qui utilise le trait respecte les contraintes implicites exigées par le trait. Ce problème peut être limité par l'ajout de méthodes abstraites au trait.
Les Abstract Base Class (ABC) de Python, genre d'interfaces, déclarent les méthodes abstraites dont elles ont besoin. Si une classe qui l'utilise n'implémente pas toutes les méthodes abstraites, une exception est levée. La plupart des ABC utilisent uniquement des méthodes, ce qui laisse plus de libertés au développeur qui souhaite l'utiliser (pas d'attributs imposés). Mais si une ABC utilise un attribut, c'est elle qui doit le définir. Par exemple, MappingView a un attribut protégé self._mapping qu'elle définit dans son constructeur. KeysView est basé sur MappingView et peut donc réutiliser self._mapping : l'attribut est défini dans MappingView, on sait d'où vient (c'est explicite).
[^] # Re: Removed legacy features:
Posté par Victor STINNER (site web personnel) . En réponse au journal PHP 5.4 Alpha 1 est annoncé. Évalué à 5.
J'ai lu http://blog.runpac.com/post/php-point-sur-traits-trunk et je sais maintenant un peu mieux ce qui me dérange.
Un trait peut accéder aux attributs et méthodes de l'objet sans que ces attributs et méthodes soient définis. Il faut donc espérer que la classe qui utilise le trait respecte les contraintes implicites exigées par le trait. Ce problème peut être limité par l'ajout de méthodes abstraites au trait.
Les Abstract Base Class (ABC) de Python, genre d'interfaces, déclarent les méthodes abstraites dont elles ont besoin. Si une classe qui l'utilise n'implémente pas toutes les méthodes abstraites, une exception est levée. La plupart des ABC utilisent uniquement des méthodes, ce qui laisse plus de libertés au développeur qui souhaite l'utiliser (pas d'attributs imposés). Mais si une ABC utilise un attribut, c'est elle qui doit le définir. Par exemple, MappingView a un attribut protégé self._mapping qu'elle définit dans son constructeur. KeysView est basé sur MappingView et peut donc réutiliser self._mapping : l'attribut est défini dans MappingView, on sait d'où vient (c'est explicite).
Documentation des ABC :
http://docs.python.org/dev/library/collections.abc.html
Le code (très clair je trouve) :
http://hg.python.org/cpython/file/default/Lib/collections/abc.py
La PEP associée (Introducing Abstract Base Classes) :
http://www.python.org/dev/peps/pep-3119/