![](/img/trans.png)
[英]Using super() in a property's setter method when using the @property decorator raises an AttributeError
[英]Python: Directly access setter method of property when using the @property decorator
我想利用python中的属性,同时在某些情况下仍然能够直接调用属性的setter方法。 原因是,在使用PySide / PyQt时,我需要在lambda语句中分配变量。
下面的示例包括两个类,它们的行为几乎相同。 一种使用property()
,另一种使用@property
。
class Test1:
def __init__(self):
self._x = 0
def setx(self, value):
print(f'x set to {value}')
self._x = value
x = property(fset=setx)
class Test2:
def __init__(self):
self._x = False
@property
def x(self):
return self._x
@x.setter
def x(self, value):
print(f'x set to {value}')
self._x = value
t1 = Test1()
print('Test1:')
t1.x = 1
setattr(t1, 'x', 2)
t1.setx(3)
t2 = Test2()
print('Test2:')
t2.x = 1
setattr(t2, 'x', 2)
效果很好。 对于类Test1
我可以使用3种不同的方式将值分配给变量。 其中的2个可以在lambda语句中使用。
但是,如果我使用@property
装饰器,则只剩下2种方法(据我所知至少!)。 而且在lambda语句中分配的唯一可能方法是使用setattr
,我宁愿避免这样做,因为它损害了我的可读性:(
有没有办法在仍然可以直接使用setter的同时使用@property
装饰器的语法糖?
编辑:实际上,有一种方法可以做到
class C:
def __init__(self):
self._x = 4
@property
def x(self):
return self._x
@x.setter
def x(self, x):
self._x = x
c = C()
c.x == 4
C.x.fset(c, 3)
c.x == 3
但这远比setattr
可读性差,所以我不会使用它。
不,没有。 但是您不应该期望会有。
现在抱怨你只有两种不同的做事方法,这不是一个好理由。
就像@ Aran-Fey所说的那样,您可以像示例中一样使用真正的def
函数或setattr
。 使用这些是没有错的,任何值得在python中吃盐的人都会知道发生了什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.