Тоже самое? Нет. Вы не можете делать то, что делает этот декоратор без магии, как sys.settrace. (Технически это не обязательно должен быть sys.settrace, но использование чего-то другого - например, переписывание байт-кода - не будет улучшением.) Вы можете сделать это намного проще, например, сделав:
def Property(f):
fget, fset, fdel = f()
fdoc = f.__doc__
return property(fget, fset, fdel, fdoc)
class Foo(object):
@Property
def myprop():
"Property docstring"
def fget(self):
return 'fget'
def fset(self, x):
pass
def fdel(self):
pass
return fget, fset, fdel
В Python 2.6 и более поздних версиях вы можете использовать немного другой декоратор, однако:
def Property(cls):
fget = cls.__dict__.get('fget')
fset = cls.__dict__.get('fset')
fdel = cls.__dict__.get('fdel')
fdoc = cls.__doc__
return property(fget, fset, fdel, fdoc)
И вы бы использовали это так:
class Foo(object):
@Property
class myprop(object):
"Property docstring"
def fget(self):
return 'fget'
def fset(self, x):
pass
def fdel(self):
pass
Однако, более идиоматический способ сделать это в Python 2.6 и более поздних версиях выглядит так:
class Foo(object):
@property
def myprop(self):
"Property docstring"
return 'fget'
@myprop.setter
def myprop(self, x):
pass
@myprop.deleter
def myprop(self):
pass