为什么这个python装饰器拒绝设置setter?

问题描述 投票:0回答:1

这是我的代码:

class Property:
    def __init__(self, fget, fset):
        self.fget = fget
        self.fset = fset

    def __get__(self, obj, objtype=None):
        return self.fget(obj)
    
    def __set__(self, obj, value):
        self.fset(obj, value)

class X:
    def __init__(self, val):
        self.__x = val

    @Property
    def x(self):
        return self.__x

    @x.setter
    def x(self, val):
        self.__x = int(val)

myx = X(13)
print(myx.x)

我收到此错误:

Traceback (most recent call last):
  File  "/home/izilinux/git/python/property/ex2.py", line 21, in <module>
    class X:
File "/home/izilinux/git/python/property/ex2.py", line 26, in X
    def x(self):
TypeError: Property.__init__() missing 1 required positional argument: 'fset'

吸气剂工作正常!当我尝试将 setter 合并到代码中时,问题就开始了。有什么想法吗?

python python-decorators python-descriptors
1个回答
0
投票

当您使用 @Property 时,Python 需要 Property 类中的 fget 和 fset 参数,但您没有提供它们。要解决此问题,您需要通过显式传递 getter 和 setter 函数来使用 Property 类:

class Property:
def __init__(self, fget=None, fset=None):
    self.fget = fget
    self.fset = fset

def __get__(self, obj, objtype=None):
    return self.fget(obj)

def __set__(self, obj, value):
    self.fset(obj, value)

class X:
def __init__(self, val):
    self.__x = val

@Property
def x(self):
    return self.__x

@x.setter
def x(self, val):
    self.__x = int(val)

myx = X(13)
print(myx.x)
© www.soinside.com 2019 - 2024. All rights reserved.