На самом деле мой вопрос уже обсуждался здесь ранее: Как я могу использовать дескрипторы для нестатических методов?
И было несколько хороших способов сделать это, назвав 3 из них специально:
- Используйте свойства и определяйте геттер и сеттер отдельно ( Принято решение, но теряется инкапсуляция )
- Используйте ClassFactory для создания отдельных классов просто для созданияразделение статических полей ( Хороший обходной путь, но не реальное решение )
- Игнорируйте функции дескриптора и свойств и просто используйте функцию set и get в обычном режиме.( Окончательно выбранное решение лицом, которое инициировало вопрос, просто потому, что оно, я думаю, самое простое! )
Все вышеперечисленные решения работают хорошо, но мне неони завершены.Вы можете увидеть мои комментарии для каждого предложенного решения в скобках.
Теперь я хотел бы задать тот же вопрос еще раз, но на этот раз, рассматривая этот конкретный вариант использования:
Я создаю несколько помощниковдля других разработчиков, и я хотел бы скрыть (инкапсулировать) все избыточные вещи в вспомогательных классах и просто упростить их использование для других разработчиков, которые могут ничего не знать о свойствах.
Этоэто пример, который я хотел бы использовать разработчикам:
class TestStruct(BaseStruct):
# define structure
field1 = SomeField()
field2 = OtherField()
field3 = NextField()
BaseStruct и SomeField / OtherField / ThirdField являются частью вспомогательных классов, и другие разработчики их не видят, а просто используют их.
Затем они могут сосредоточиться на определении структуры, а не на определении свойств и т. Д., И они просто будут использовать такие поля, как:
my_struct = TestStruct()
my_struct.field1 = SOME_VALUE
...
Но проблема в том, что поля определены как статические члены, которыемы знаем все нижние части статических полей в этом случае.
Так что вопрос в том, как я могу иметьони нестатичны и сохраняют структуру в TestStruct простой, перенося всю сложность определения свойств (или чего-либо еще) в BaseStruct.
Обратите внимание, что поля определяются другими разработчиками, и мы не делаемзнать о них.
Любые предложения в Python 2 или 3 приветствуются.