Страницы

Поиск по вопросам

понедельник, 19 ноября 2018 г.

Существуют ли генераторы (фабрики) функций?

Дано: класс с десятком полей. Необходимо: с помощью встроенного декоратора @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 и так с каждым полем. В результате очень много дублирующегося кода. Суть вопроса: существует - ли более красивое/питоновское(Пайтоновское) решение или все это оформить в отдельном файле как есть? Возможно, существуют "Генераторы(фабрики) функций(методов)" или декораторы, или неизвестное мне решение? Интересуют идеи, мысли и личный опыт Спасибо ReinRaus - Решение простое и гениальное. O_o и тут я понял как-же мало я знаю Cсылка рано или поздно станет битой, с Вашего разрешения, выложу код здесь Вопрос решен. 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)


Ответ

Языком это не предусмотрено. Можно попробовать сделать свою форму записи. Я реализовал в такой форме: @myProp def propName(self, value=None): if value: ... # это setter return ...# это геттер Реализация здесь: http://ideone.com/Y5HYEn У меня не получилось навести красоту: внести массив props в сам класс, потому что на момент компиляции декораторов класса test не существует, поэтому я вынес этот массив в глобальный. Некроправка Захотел сделать себе так же, но предварительно навел небольшую красоту, теперь просто есть класс, который нужно унаследовать. class test(myProp):
@myProp.wrapper def myfunc(self, value=None): if value: # setter return # getter Полный код: http://ideone.com/ZsOF5z class myProp: __props={} def __getattribute__(self, name): if name in object.__getattribute__(self, "_myProp__props").keys(): return self.__props[name](self) return object.__getattribute__(self, name) def __delattribute__(self, name): if name in self.__props.keys(): del self.__props[name] return object.__delattribute__(self, name) def __setattr__(self, name, value): if name in self.__props.keys(): return self.__props[name](self, value) return object.__setattr__(self, name, value) @classmethod def wrapper(self, fn): self.__props[fn.__name__]=fn
class test(myProp): def __init__(self): self.x=5
@myProp.wrapper def myfunc(self, value=None): if value: self.x=value*2 return self.x-2

Комментариев нет:

Отправить комментарий