(Not sure why this is on python-ideas - wouldn't python-list be more appropriate? Keeping it where it is for now though.)
On Thu, Jul 2, 2020 at 5:14 PM Greg Ewing <greg.ew...@canterbury.ac.nz> wrote: > > The @property.getter and @property.setter decorators are > clever, but they have the disadvantage that you end up > writing the name of the property no less than 5 times, > all of which have to match. > > Thinking there must be a better way, I came up with this: > > def Property(name, bases, dict): > return property(dict.get('get'), dict.get('set')) > > which allows you to write > > class Test: > > class foo(metaclass = Property): > > def get(self): > print("Getting foo") > return self._foo > > def set(self, x): > print("Setting foo to", x) > self._foo = x > > test = Test() > test.foo = 42 > print(test.foo) > > Output: > Setting foo to 42 > Getting foo > 42 > I quite like the use of class blocks as namespaces, but I'm not a fan of metaclassing. A decorated class is way cleaner in the source code. How about this? def Property(ns): return property(*[getattr(ns, k, None) for k in ("fget", "fset", "fdel", "__doc__")]) class Test: @Property class foo: """Docstring for foo""" def fget(self): print("Getting foo") return self._foo def fset(self, x): print("Setting foo to", x) self._foo = x Same output as yours, and it's easy to support fdel, and a docstring. ChrisA _______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/BKEHOXQEHEI44OZFE5U5SG3E3LTCISMW/ Code of Conduct: http://python.org/psf/codeofconduct/