Obj-C (который я не использовал долгое время) имеет нечто, называемое category для расширения классов. Объявляя категорию с новыми методами и компилируя ее в вашу программу, все экземпляры класса неожиданно получают новые методы.
Python имеет возможности mixin, которые я использую, но mixins нужно использовать снизу программы: класс должен объявить его сам.
Предусмотренный вариант использования категории: скажем, у вас есть большая иерархия классов, которая описывает различные способы взаимодействия с данными, объявляя полиморфные способы получения различных атрибутов. Теперь категория может помочь потребителю этих описывающих классов, реализовав удобный интерфейс для доступа к этим методам в одном месте. (Метод категории может, например, попробовать два разных метода и вернуть первое определенное (не None) возвращаемое значение.)
Есть ли способ сделать это в Python?
Иллюстративный код
Я надеюсь это проясняет то, что я имею в виду. Дело в том, что категория похожа на агрегатный интерфейс, и потребитель AppObj может изменить его в его коде.
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())