1、@property装饰器
@property
装饰器是一个更方便、简洁的方式,用于将类中的方法转换为同名的只读属性。通过在方法定义前加上 @property
装饰器,可以将这个方法作为属性的"获取"方法。如还需要定义设置或删除属性的方法,可以使用 @
属性名.setter
和 @属性名.deleter
装饰器。
class Celsius:
def __init__(self, temperature=0):
self._temperature = temperature
@property
def temperature(self):
print("Getting value...")
return self._temperature
@temperature.setter
def temperature(self, value):
print("Setting value...")
if value < -273.15:
raise ValueError("Temperature below -273.15 is not possible.")
self._temperature = value
# 使用
c = Celsius()
c.temperature = 37
print(c.temperature)
2、property() 函数
property()
是一个内置函数,可以用来创建或返回一个属性值。property()
函数的典型用法是在类定义中创建一个只读属性,它接受四个参数:fget
, fset
, fdel
和 doc
,分别对应属性的获取方法、设置方法、删除方法和文档字符串。
参数 | 描述 |
---|---|
fget | 用于获取属性值的函数 |
fset | 用于设置属性值的函数 |
fdel | 用于删除属性值的函数 |
doc | 属性的文档字符串,如果没有提供, 则从fget函数中获取 |
使用示例:
class Celsius:
def __init__(self, temperature=0):
self._temperature = temperature
def get_temperature(self):
print("Getting value...")
return self._temperature
def set_temperature(self, value):
print("Setting value...")
if value < -273.15:
raise ValueError("Temperature below -273.15 is not possible.")
self._temperature = value
temperature = property(get_temperature, set_temperature)
# 使用
c = Celsius()
c.temperature = 38
print(c.temperature)
3、property() 函数 和 @property装饰器 区别
property()
函数 需要显式地传入获取、设置、删除方法和文档字符串,适用于早期的Python版本,或者当需要在运行时动态地创建属性时。@property
装饰器 提供了一种更为简洁和直观的方式来定义属性及其访问器方法。它使得代码更加易读和易于维护。@property
装饰器是更推荐的方式,因为它让代码更加简洁和Pythonic。然而,了解 property()
函数的工作方式也是很有用的,尤其是在需要与早期代码兼容或执行一些特殊操作时。