Python:在使用@property decorator时直接访问属性的setter方法
我希望在python中使用属性,同时在某些情况下仍然能够直接调用属性的setter方法。原因是,在使用PySide/PyQt时,我需要在lambda语句中分配变量 下面的示例包括两个行为几乎相同的类。一个使用Python:在使用@property decorator时直接访问属性的setter方法,python,properties,pyqt,pyside,getter-setter,Python,Properties,Pyqt,Pyside,Getter Setter,我希望在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}')
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语句中使用
但是,如果我使用的是@属性
装饰器,我只剩下两条路了(至少在我看来!)。在lambda语句中赋值的唯一可能方法是使用setattr
,我宁愿避免使用它,因为在我看来这会损害可读性:(
问题:
有没有一种方法可以在仍然能够直接使用setter的情况下使用
@属性
装饰器的语法糖?编辑:实际上,有一种方法可以做到这一点
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中称职的人都会明白发生了什么。编辑:实际上,有一种方法可以做到这一点
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中称职的人都会理解所发生的事情。“原因是,我需要在lambda语句中分配变量”,这不是一个很好的理由。1)可以使用实函数而不是lambda。2) 还有。@Aran Fey:1)我真的不想使用真正的函数,因为我有几十个这样的赋值,这将极大地增加我的代码。2) 在我看来,这有点难看,但却是真的:)@johnson。当然,getter/setter方法会减少膨胀,因为不需要decorator。我还认为它们在pyqt/pyside程序中更有效、更可读,因为它们可以用作插槽,并且与现有QtaPI的风格一致。“原因是,我需要在lambda语句中分配变量”,这不是一个好的理由。1) 可以使用实函数而不是lambda。2) 还有。@Aran Fey:1)我真的不想使用真正的函数,因为我有几十个这样的赋值,这将极大地增加我的代码。2) 在我看来,这有点难看,但却是真的:)@johnson。当然,getter/setter方法会减少膨胀,因为不需要decorator。我还认为它们在pyqt/pyside程序中更有效,可读性更强,因为它们可以用作插槽,并且与现有qt API的风格一致。我不是在抱怨,在决定我最喜欢哪种方法并希望在未来使用之前,我会尝试找出所有可能的方法。set是唯一对我有效的方法。当我在lamba中使用setattr时,它一直在呼叫getter。我不是在抱怨,我只是在决定我最喜欢并希望在未来使用哪种方法之前,尝试找出所有可能的方法。set是唯一对我有效的方法。当我在lamba中使用setattr时,它一直在调用getter。