@property和@propertyName.setter之间有区别吗



最近我在处理属性时遇到了getter和setter。在大多数例子中,使用了这种语法

class ClassName():
def __init__(self, xSize: int, ySize: int):
self.xSize: int = xSize
self.ySize: int = ySize
@property
def propertyName(self):
return self._propertyName
@propertyName.setter
def propertyName(self, field: list):
self._propertyName = field

我的问题是,这个和那个有区别吗?在我的代码中,我尝试了这两种方法,它们的工作原理似乎是一样的。

class ClassName():
def __init__(self, xSize: int, ySize: int):
self.xSize: int = xSize
self.ySize: int = ySize
@propertyName.getter
def propertyName(self):
return self._propertyName
@playingField.setter
def playingField(self, field: list):
self._propertyName = field

您的第一个代码(在去掉装饰器语法后)(大部分)与等效

class ClassName():
def __init__(self, xSize: int, ySize: int):
self.xSize: int = xSize
self.ySize: int = ySize
def propertyName(self):
return self._propertyName
propertyName = property(propertyName)
def property_name(self, field: list):
self._propertyName = field
propertyName = propertyName.setter(propertyName)

(Decorator语法负责在def语句重新绑定名称之前评估propertyName.setter。)

propertyName.setter是一个将函数作为参数并返回property实例的方法。当用作装饰器时,它会将原始属性替换为新属性。它不会修改现有属性。

如果在尝试访问propertyName.getter时尚未定义propertyName,则第二个代码将失败。如果你的方法似乎有效,那是因为你在一个环境中以某种方式执行它,在这个环境中,propertyName的先前定义仍然在具有适当值的范围内。

decorator语法或属性并没有什么特别神奇的地方。这一切都是简单的函数应用程序和名称绑定。

相关内容

  • 没有找到相关文章

最新更新