Я хотел бы создать декоратор уровня класса, который автоматически добавляет свойство к объекту, включая соответствующие методы getter и setter и опорную переменную. Например:Создайте декоратор уровня класса, чтобы автоматически добавить свойство
@autoproperty("foo", can_get=True, can_set=True, allow_null=False, default_value=0)
@autoproperty("baz", can_get=True, can_set=False, allow_null=True, default_value=0)
@autoproperty("bar")
class SomeNonTrivialClass(object):
def __init__(self):
#lots of stuff going on here
def discombobulate(self):
#this is obviously a very trivial example
local_foo = self.foo;
if (local_foo > 10):
raise RuntimeError("Foo can never be more than 10")
else:
#do whatever with foo
if __name__ == '__main__':
test = SomeNonTrivialClass()
test.foo = 5
test.discombobulate()
test.foo = 11
test.discombobulate()
Я часто ловлю себя на создании серии «пол-комплекс» геттеры/сеттеров (они могли бы быть сделаны только с простым свойством, но они нуждаются в значениях по умолчанию и нулевой защита, я хотел бы быть просто. возможность указать декоратор, который делает тяжелую работу по созданию свойств на новых экземплярах класса.
Если я способ покинуть базу в этом подходе, я открыт к столь же жизнеспособному подходу.
Любой помощь будет оценен.
Я работаю с python 3.X и python 2.7, поэтому что-то, что работает в любом случае, является предпочтительным, но не необходимым.
Обновление: Я добавил немного больше разнообразия в то, что я ищу. В общем, мне нужно иметь возможность создавать множество этих простых автоматических свойств (ala C# auto-property, но с немного большей гибкостью). Я не обязательно хочу раскрывать хранилище, но я хочу убедиться, что проверка экземпляра объекта (не обязательно класса) показывает свойства, которые были созданы.
похоже, что вы можете написать некоторые [пользовательские дескрипторы] (http://me.veekun.com/blog/2012/05/23/python-faq-descriptors/). – Eevee
Что вы думаете? –
@ Robᵩ мой вопрос - как создать декоратор уровня класса, который автоматически создаст правильное свойство в классе при создании экземпляра. – GrayWizardx