Obj-C (que no he usado durante mucho tiempo) tiene algo llamado categories para extender las clases. Al declarar una categoría con nuevos métodos y compilarla en su programa, todas las instancias de la clase de repente tienen los nuevos métodos.¿Cómo hacer categorías Obj-C en Python?
Python tiene posibilidades de mixin, que yo uso, pero las mixins deben usarse desde la parte inferior del programa: la clase tiene que declararse por sí misma.
Caso de uso de categorías previstas: Supongamos que tiene una gran jerarquía de clases que describe diferentes formas de interactuar con datos, declarando formas polimórficas para obtener diferentes atributos. Ahora, una categoría puede ayudar al consumidor de estas clases descriptivas mediante la implementación de una interfaz conveniente para acceder a estos métodos en un solo lugar. (Un método de categoría podría, por ejemplo, probar dos métodos diferentes y devolver el primer valor de retorno definido (distinto de Ninguno).
¿Alguna forma de hacerlo en Python?
código ilustrativo
I esperanza que esto aclare a qué me refiero. El punto es que la Categoría es como una interfaz agregada, que el consumidor de AppObj puede cambiar en su código.
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())
En su ejemplo, le instanciar AppObj o AppObjCategory? BTW Python tiene decoradores de clase ahora en 2.6: http://docs.python.org/whatsnew/2.6.html#pep-3129-class-decorators –
I instancia de AppObj (y subclases de los mismos). El código de Categoría puede estar completamente separado (es decir, AppObj puede estar en una biblioteca, la Categoría en la aplicación). – u0b34a0f6ae
Quizás solo sea un caso para implementar el decorador de la categoría Category en ese momento; copie todos los atributos de la Categoría a la clase base, omitiendo algunos atributos como ... __doc__ y __dict__? – u0b34a0f6ae