Obj-C (que je n'ai pas utilisé depuis longtemps) a quelque chose appelé categories pour étendre les classes. Déclarant une catégorie avec de nouvelles méthodes et la compilant dans votre programme, toutes les instances de la classe ont soudainement les nouvelles méthodes.Comment faire Catégories Obj-C en Python?
Python a des possibilités de mixage, que j'utilise, mais les mixins doivent être utilisés depuis le bas du programme: la classe doit le déclarer lui-même. Use-case Catégorie de cas d'utilisation: Supposons que vous ayez une grande hiérarchie de classes qui décrivent différentes manières d'interagir avec des données, en déclarant des méthodes polymorphiques pour obtenir différents attributs. Maintenant, une catégorie peut aider le consommateur de ces classes décrivant en mettant en œuvre une interface pratique pour accéder à ces méthodes en un seul endroit. (Une méthode de catégorie pourrait, par exemple, essayer deux méthodes différentes et renvoyer la première valeur de retour définie (non-None).)
Une façon de faire cela en Python?
Code illustrative
Je espoir cela clarifie ce que je veux dire. Le point est que la catégorie est comme une interface agrégée, que le consommateur d'AppObj peut changer son code.
class AppObj (object):
"""This is the top of a big hierarchy of subclasses that describe different data"""
def get_resource_name(self):
pass
def get_resource_location(self):
pass
# dreaming up class decorator syntax
@category(AppObj)
class AppObjCategory (object):
"""this is a category on AppObj, not a subclass"""
def get_resource(self):
name = self.get_resource_name()
if name:
return library.load_resource_name(name)
else:
return library.load_resource(self.get_resource_location())
Dans votre exemple, seriez-vous instancier AppObj ou AppObjCategory? BTW Python a des décorateurs de classe maintenant dans 2.6: http://docs.python.org/whatsnew/2.6.html#pep-3129-class-decorators –
J'instancie AppObj (et ses sous-classes). Le code de catégorie peut être complètement séparé (par exemple AppObj peut être dans une bibliothèque, la catégorie dans l'application). – u0b34a0f6ae
Peut-être que c'est juste un cas pour implémenter le décorateur de catégorie Catégorie à ce moment-là; copier tous les attributs de la catégorie vers la classe de base, en ignorant certains attributs comme .. __doc__ et __dict__? – u0b34a0f6ae