最近我在处理属性时遇到了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语法或属性并没有什么特别神奇的地方。这一切都是简单的函数应用程序和名称绑定。