Форум сайта python.su
Дано: класс с десятком полей.
Необходимо: с помощью встроенного декоратора @property преобразовать каждое поле в свойство т.е.
class Static: def __init__(self, **kwargs) if 'today' in kwargs: self.today = kwargs['today'] else: self.today = datetime.date.today() #поля в таком-же стиле т.е. разная статика @property def today(self): return self.today @today.setter def today(self,value): self.today = value @today.deleter def today(self): del self.today
Отредактировано Rom4eg196 (Апрель 21, 2013 22:29:00)
Офлайн
Сделать, наверное, можно, заюзав метапрограммирование.
Вопрос в том, зачем вам эти свойства.
Ведь в этом виде
@property def today(self): return self.today @today.setter def today(self,value): self.today = value @today.deleter def today(self): del self.today
Офлайн
FishHookЗнаю, можно и напрямую изменить поле, но тогда теряется парадигма ооп. Свойства нужны для реализации инкапсуляции.
обращение к свойству, ничем не отличается от обращения напрямую к полю.
FishHookпоявилась идея с использованием простых генераторов в декораторах
Но если мы добавим кода в свойства, то откуда же этот код возьмет “Генератор(фабрика) функций(методов)”?
Офлайн
Rom4eg196а так теряется здравый смысл
но тогда теряется парадигма ооп
Офлайн
Всем спасибо за ответы, решение найдено. Вопрос решен.
вот такое
props={} def myProp(fn): props[fn.__name__]=fn class test(): def __init__(self): self.x=5 def __getattribute__(self, name): if name in props.keys(): return props[name](self) return object.__getattribute__(self, name) def __delattribute__(self, name): if name in props.keys(): del props[name] return object.__delattribute__(self, name) def __setattr__(self, name, value): if name in props.keys(): return props[name](self, value) return object.__setattr__(self, name, value) @myProp def myfunc(self, value=None): if value: self.x=value*2 return self.x-2 x= test() print(x.myfunc) x.myfunc=6 print(x.myfunc)
Офлайн
Поддерживаю appetito. Если свойство не делает ничего, кроме как возвращает и изменяет значение, то его можно заменить обращением к полю напрямую. Проблема появляется, когда вы все-таки хотите добавить некоторую логику в свойство, а весь клиентский код уже написан так, что обращается напрямую к полю. Его приходится переписывать. В случае с питоном для клиента прозрачно, обращается он к свойству или полю, вызов в любом случае будет “x.myfunc”. Когда понадобится свойство, то вы просто сделаете поле закрытым, а на его место подставите вызов свойства. Клиентский код ничего не заметит, а вы сохраните инкапсуляцию.
Отредактировано Soteric (Апрель 22, 2013 15:43:04)
Офлайн
Rom4eg196Вы не замечали, что ООП в питоне и ООП в Джаве это несколько разные вещи?
Знаю, можно и напрямую изменить поле, но тогда теряется парадигма ооп. Свойства нужны для реализации инкапсуляции.
Офлайн
FishHook
+1
Добавлю из недаво сказанного:
Guido van Rossum
Don't write Java (or C++, or Javascript, …) in Python
Офлайн
Ребят, вы правда считаете, что код представленный выше аля “Решение вопроса” нарушает Дзен Питона или концепцию ООП?
Я старался сохранить баланс между постулатами Питона и ООП, разве получилось плохо?
Во всем важен баланс, слепое следование одному, конкретному постулату(парадигме и т.д.) в результате приведет к говнокоду который не достоин существования.
к Soteric:
Полностью согласен с Вами, сам придерживаюсь правила “Первое и основное выполнение поставленной задачи”, а рефакторинг и красота после. Вопрос задавался на этапе рефакторинга, изначально задача была выполнена максимально просто и быстро, скрипт работает и работает стабильно. Но разобратся в коде очень сложно, поэтому начал рефакторить код и приводить к адекватному виду и читаемости.
Офлайн
Я к тому, что если свойство ничего не делает, то его можно не создавать. Если делает, то его все равно придется написать. Поэтому ваша конструкция ничего не дает.
Офлайн