繁体   English   中英

Python:使用@property装饰器时直接访问属性的setter方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM