Я пишу класс оболочки Python для C# API, доступ к которому осуществляется через Pythonnet. Как я хочу, чтобы расширить API со своими собственными методами я решил обернуть его с помощью композиции подхода, изложенного here:Python property factory или класс дескриптора для обертывания внешней библиотеки
C# API делает интенсивное использование свойств, которые я хочу, чтобы имитировать в моем коде Python. Следующий минимальный пример показывает мой нынешний подход к примеру класса # Surface C с двумя свойствами ширина и высота:
class MySurface:
def __init__(api_surface):
self.api_surface = api_surface
@property
def width(self):
return self.api_surface.width
@width.setter
def width(self, value):
self.api_surface.width = value
@property
def height(self):
return self.api_surface.height
@height.setter
def height(self, value):
self.api_surface.height = value
В целом, мне приходится иметь дело с около 50 свойств. Для нескольких групп свойств я хочу добавить свои собственные проверки ошибок, тип конверсий и т. Д. То, что я ищу, - это метод Pythonic для определения свойств, например. через фабрику или с использованием дескрипторов. Спасибо за вашу помощь!
Редактировать: Я хочу иметь возможность использовать вкладку в оболочке python, то есть на поверхности. {hit tab} должен предлагать surface.width и surface.height. Это не представляется возможным с помощью подхода getattr, изложенного Грегом.
Это действительно хороший пример альтернативного шаблона композиции в Python (вместо использования '__getattr__' и' __setattr__' для делегирования поиска атрибутов члену). –