Obj-C (które nie były używane przez dłuższy czas) ma coś, co nazywa categories przedłużyć klas. Deklarując kategorię nowymi metodami i kompilując ją do swojego programu, wszystkie instancje klasy nagle mają nowe metody.Jak zrobić kategorie Obj-C w Pythonie?
wstawek Python ma możliwości, których używam, ale wstawek należy stosować od dołu programu: klasa musi to zadeklarować się.
Przypadek użycia przypadku: Powiedz, że masz dużą hierarchię klas opisującą różne sposoby interakcji z danymi, deklarującą polimorficzne sposoby uzyskiwania różnych atrybutów. Teraz kategoria może pomóc konsumentowi w opisywaniu klas poprzez wdrożenie wygodnego interfejsu umożliwiającego dostęp do tych metod w jednym miejscu. (Sposób kategoria może na przykład spróbować dwóch różnych metod i zwróci pierwszy zdefiniowana (non-None) wartości zwracanej.)
jakikolwiek sposób zrobić to w Pythonie?
kod poglÄ
I nadzieja ten wyjaśnia, co mam na myśli. Chodzi o to, że kategoria jest jak kruszywa interfejsem, że konsument AppObj można zmienić w kodem.
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())
W przykładzie byś instancję AppObj lub AppObjCategory? BTW Python ma teraz dekoratory klas w wersji 2.6: http://docs.python.org/whatsnew/2.6.html#pep-3129-class-decorators –
Tworzę instancję AppObj (i jej podklasy). Kod kategorii może być całkowicie oddzielny (tzn. AppObj może znajdować się w bibliotece, kategoria w aplikacji). – u0b34a0f6ae
Może to tylko przypadek za wdrażanie Kategoria klasy dekoratora tuż potem; skopiować wszystkie atrybuty od kategorii, do klasy bazowej, pomijając pewne atrybuty jak .. __doc__ i __dict__? – u0b34a0f6ae