Python property()函数:定义属性
Python是一种面向对象的编程语言,它提供了一种特殊的方法来访问和修改对象的属性。这种方法称为“属性(property)”,它使得对象的属性访问变得更加简单、优雅。Python中的内置函数property()就是用来定义属性的。
1. 定义属性
在Python中,属性是一种特殊的数据成员,它通常绑定在类的实例上。属性可以是只读的、只写的或可读写的。在Python中,我们可以使用@property装饰器来定义属性:
class Temperature:
def __init__(self, celsius):
self.celsius = celsius
@property
def fahrenheit(self):
return self.celsius * 1.8 + 32
@fahrenheit.setter
def fahrenheit(self, value):
self.celsius = (value - 32) / 1.8
在这个例子中,我们定义了一个名为Temperature的类,它有一个名为celsius的实例变量,以摄氏度为单位存储温度。我们还定义了一个名为fahrenheit的属性,它以华氏度为单位返回温度。
注意,我们在定义fahrenheit属性时使用了@property和@fahrenheit.setter两个装饰器。@property装饰器将fahrenheit方法转化为一个只读属性,而@fahrenheit.setter装饰器则将fahrenheit方法转化为一个可写属性。
现在,我们可以创建一个Temperature对象,然后访问和修改它的温度属性:
t = Temperature(25)
print(t.celsius) # 输出25
print(t.fahrenheit) # 输出77.0
t.fahrenheit = 86
print(t.celsius) # 输出30.0
2. 只读属性
有时候,我们希望某个属性只能被访问而不能被修改,这时可以使用只读属性。只读属性可以通过@property装饰器来实现:
class Circle:
def __init__(self, radius):
self.radius = radius
@property
def diameter(self):
return self.radius * 2
@property
def area(self):
return self.radius ** 2 * 3.14
c = Circle(10)
print(c.radius) # 输出10
print(c.diameter) # 输出20
print(c.area) # 输出314.0
c.area = 100 # AttributeError: can't set attribute
在这个例子中,我们定义了一个名为Circle的类,它有一个名为radius的实例变量,表示半径。我们还定义了一个名为diameter和一个名为area的只读属性,表示直径和面积。
3. 可写属性
如果一个属性只能被修改而不能被访问,那么它就是一个可写属性。可写属性可以通过@属性名.setter装饰器来实现:
class Rectangle:
def __init__(self, width, height):
self._width = width
self._height = height
@property
def width(self):
return self._width
@width.setter
def width(self, value):
if value <= 0:
raise ValueError("Width must be positive")
self._width = value
@property
def height(self):
return self._height
@height.setter
def height(self, value):
if value <= 0:
raise ValueError("Height must be positive")
self._height = value
@property
def area(self):
return self._width * self._height
r = Rectangle(10, 20)
print(r.width) # 输出10
print(r.height) # 输出20
print(r.area) # 输出200
r.width = 5
r.height = 10
print(r.width) # 输出5
print(r.height) # 输出10
print(r.area) # 输出50
r.width = -1 # ValueError: Width must be positive
在这个例子中,我们定义了一个名为Rectangle的类,它有两个名为width和height的实例变量,表示宽度和高度。我们还定义了一个名为area的只读属性,表示面积。
注意,我们使用了@property和@width.setter两个装饰器来定义width属性。这样一来,我们就可以使用r.width = value的形式来修改width属性了。
如果我们试图修改一个不合法的属性值,比如将宽度设置为负数,Python会抛出ValueError异常。
4. 计算属性
有时候,我们需要根据其他属性计算出一个新的属性,这就是计算属性。计算属性可以通过@property装饰器来实现:
class BankAccount:
def __init__(self, balance):
self.balance = balance
@property
def overdraft(self):
if self.balance < 0:
return abs(self.balance)
else:
return 0
@property
def interest(self):
return max(self.balance * 0.01, 0)
b = BankAccount(1000)
print(b.overdraft) # 输出0
print(b.interest) # 输出10.0
b.balance = -500
print(b.overdraft) # 输出500
print(b.interest) # 输出0
在这个例子中,我们定义了一个名为BankAccount的类,它有一个名为balance的实例变量,表示余额。我们还定义了一个名为overdraft和一个名为interest的计算属性,表示透支金额和利息。
注意,我们使用了@property装饰器来定义overdraft和interest属性。这样一来,我们就可以像访问普通属性一样访问它们了。
5. 总结
property()函数是Python中定义属性的一种方便方式,它可以让属性的访问和修改变得更加简单、优雅。在本文中,我们介绍了如何使用@property和@属性名.setter两个装饰器来定义只读属性、可写属性和计算属性。在编写Python程序时,清楚地理解属性的定义和使用方法是非常重要的,它可以让我们的程序更加易于理解和维护。