gpt4 book ai didi

python - 装饰器是被装饰对象的属性?

转载 作者:行者123 更新时间:2023-12-01 00:00:45 25 4
gpt4 key购买 nike

我想创建一个装饰器,它允许我引用装饰对象并从中获取另一个装饰器,就像在属性上使用 setter/deleter 一样:

@property
def x(self):
return self._x

@x.setter
def x(self, y):
self._x = y

具体来说,我希望它的行为与属性基本相同,但模拟序列而不是单个值。这是我的第一次尝试,但似乎不起作用:

def listprop(indices):
def dec(func):
class c(object):
def __init__(self, l):
self.l = l
def __getitem__(self, i):
if not i in self.l:
raise Exception("Invalid item: " + i)
return func(i)
@staticmethod
def setter(func):
def set(self, i, val):
if not i in self.l:
raise Exception("Invalid item: " + i)
func(i, val)
c.__setitem__ = set
return c(indices)
return dec

# ...
class P:
@listprop(range(3))
def prop(self, i):
return get_prop(i)

@prop.setter
def prop(self, i, val):
set_prop(i, val)

我很确定 c.__setitem__ = set 是错误的,但我不知道如何获取此时实例的引用。有想法吗?

Alex Martelli 的解决方案适用于 2.6,但在 2.4 和 2.5 上有些问题(我希望它也适用于这些旧版本,尽管这不是绝对必要的):

2.4:

>>> p = P()
>>> p.prop
>>> p.prop[0]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: unsubscriptable object

2.5:

>>> p = P()
>>> p.prop
>>> p.prop[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is unsubscriptable

2.6:

>>> p = P()
>>> p.prop
<__main__.c object at 0x017F5730>
>>> p.prop[0]
0

最佳答案

我修复了许多小细节,以下版本似乎可以满足您的要求:

def listprop(indices):
def dec(func):
class c(object):
def __init__(self, l, obj=None):
self.l = l
self.obj = obj
def __get__(self, obj, cls=None):
return c(self.l, obj)
def __getitem__(self, i):
if not i in self.l:
raise Exception("Invalid item: " + i)
return func(self.obj, i)
def setter(self, sfunc):
def doset(self, i, val):
if not i in self.l:
raise Exception("Invalid item: " + i)
sfunc(self.obj, i, val)
c.__setitem__ = doset
return self
result = c(indices)
return result
return dec

# ...
class P:
@staticmethod
def get_prop(i): return i*100

@staticmethod
def set_prop(i, val): print 'set %s to %s' % (i, val)

@listprop(range(3))
def prop(self, i):
return self.get_prop(i)

@prop.setter
def prop(self, i, val):
self.set_prop(i, val)

如您所见,分配给 c.__setitem__ 不是问题 - 还有其他问题,例如 c 缺少 __get__ (因此它不是描述符,请参阅 this guiide )和 setter 返回 None (因此 p.prop 最终为 None)。

关于python - 装饰器是被装饰对象的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1033107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com