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