Python @setter用法介绍
引言
在Python中,我们经常需要对类的属性进行读取和修改。通常情况下,我们可以使用@property
来定义一个属性的getter方法,用于获取属性的值。但是,在一些情况下,我们可能还需要提供一个setter方法,用于修改属性的值。为了简化代码,Python提供了一个装饰器@setter
,可以帮助我们更方便地实现这个功能。本文将详解Python的@setter
用法。
什么是@property和@setter
@property
在介绍@setter
之前,我们先来了解一下@property
装饰器。@property
可以将一个方法装饰为一个只读属性。当我们使用该属性时,实际上是在调用这个方法。例如:
class Circle:
def __init__(self, radius):
self.radius = radius
@property
def perimeter(self):
return 2 * 3.14 * self.radius
c = Circle(5)
print(c.perimeter) # 输出:31.4
在上面的示例中,perimeter
方法被装饰为一个只读属性。当我们使用c.perimeter
时,实际上是在调用perimeter
方法,并返回计算得到的结果。
@setter
与@property
类似,@setter
装饰器用于定义一个属性的setter方法,用于修改属性的值。使用@setter
时,我们需要在@property
装饰的属性方法之后,紧跟一个setter
方法,并使用@属性名.setter
来装饰该方法。例如:
class Circle:
def __init__(self, radius):
self.radius = radius
@property
def perimeter(self):
return 2 * 3.14 * self.radius
@perimeter.setter
def perimeter(self, value):
self.radius = value / (2 * 3.14)
c = Circle(5)
c.perimeter = 20
print(c.radius) # 输出:3.1847133757961785
在上面的示例中,我们定义了一个Circle
类,其中perimeter
被装饰为只读属性。紧接着,我们定义了一个perimeter
的setter方法。当我们对perimeter
属性赋值时,实际上是在调用这个setter方法,并修改radius
属性的值。
@setter的用法
使用场景
@setter
通常用于以下场景:
- 当一个属性的值需要计算得到,而不是直接存储在类的属性中时,我们可以使用
@setter
来提供一个修改属性值的接口。 - 当某个属性的值需要经过一些处理后再进行存储时,我们可以使用
@setter
来自动执行处理操作。
示例1:计算属性的定义
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
return self.width * self.height
@area.setter
def area(self, value):
self.width = value ** 0.5
self.height = value ** 0.5
r = Rectangle(3, 4)
print(r.area) # 输出:12
r.area = 16
print(r.width, r.height) # 输出:4.0 4.0
在上面的代码中,我们定义了一个Rectangle
类,其中area
被装饰为只读属性。紧接着,我们定义了一个area
的setter方法。当我们对area
属性赋值时,实际上是在调用这个setter方法,并根据我们指定的面积重新计算宽度和高度。
示例2:属性值的处理
class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value.capitalize()
p = Person("tom")
print(p.name) # 输出:Tom
p.name = "jerry"
print(p.name) # 输出:Jerry
在上面的代码中,我们定义了一个Person
类,其中name
被装饰为只读属性。紧接着,我们定义了一个name
的setter方法。当我们对name
属性赋值时,实际上是在调用这个setter方法,并将属性值首字母大写。
注意事项
setter
方法的参数名可以自定义,但通常约定为value
。- 在setter方法内部,我们使用
self.属性名
对属性进行赋值。 - 在调用setter方法时,我们只需要给属性赋值,不需要加圆括号。
总结
@setter
装饰器是Python中用于定义属性的setter方法的一种简化方式。它可以帮助我们更方便地实现属性值的修改操作。在使用@setter
时,我们需要在@property
装饰的属性方法之后,紧跟一个setter
方法,并使用@属性名.setter
来装饰该方法。通过使用@setter
,我们可以避免手动编写setter方法的重复代码,提高开发效率。