繁体   English   中英

为什么在Python中不能反转getter / setter属性?

[英]Why can't the getter/setter properties be reversed in Python?

我试图了解属性装饰器在Python中的工作方式。 下面的代码失败,因为getter / setter装饰器的顺序错误,因此(我假设)尚未定义email属性对象。

class ReverseProperties:
    def __init__(self):
        self._email = None

    @email.setter
    def email(self, value):
        self._email = value

    @property
    def email(self):
        return self._email

我知道上面的装饰器与此等效:

def get_email(self):
    return self._email

email = property(get_email)

def set_email(self, value):
    self._email = value

email = email.setter(set_email)

但是,在使用属性装饰器时,将email存储在哪里,以便我们可以使用@email.setter装饰器? 使用这些装饰器时,类中到底发生了什么?

函数是python中的第一类,因此将它们像其他任何值一样考虑。 属性装饰器对此进行了总结,但它仍然只是一个对象。 因此,它本质上存储在email属性中。 从类级别(即未绑定到实例)看时,电子邮件是具有setter属性的对象。

正如您(在大多数情况下)在示例中所显示的那样,属性包装了一个方法。 当使用装饰器形式时,它大致等同于:

def email(self):
    return self._email

email = property(email)

def set_email(self, value):
    self._email = value

email = email.setter(set_email)

从技术上讲,此无效Python的含义更多:

email = property(def(self): return self._email)
email = email.setter(def(self, value): self._email = value)

分配给变量的名称是从def语句获取的名称。 包装函数/方法的函数是@的函数。 最后,您可以将其视为首先“访问”外部包装功能,或者将功能定义在包装之前不保存为名称,这就是为什么以下内容有效的原因(即,为什么电子邮件没有变回功能)在用作email.setter之前):

@email.setter
def email(self, value):
    self._email = value

属性是一个简单的对象,具有一个get方法,一个set方法和一个del方法。

装饰器语法只是定义属性的一种简便方法,但是您首先必须创建属性本身。 所以

@property
def email(self):
    ...

定义属性并设置get方法。

@email.setter
def email(self, value):
    ...

接收属性email并设置设置方法。

原则上您可以扭转这种情况,但是然后您必须单独执行定义步骤:

class ReverseProperties:
    def __init__(self):
        self._email = None

    email = property() # define the property

    @email.setter
    def email(self, value):
        self._email = value

    @email.getter
    def email(self):
        return self._email

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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