Python:在使用@property decorator时直接访问属性的setter方法

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}')

我希望在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语句中使用

但是,如果我使用的是
@属性
装饰器,我只剩下两条路了(至少在我看来!)。在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。