Python 从attribute到property详解

1. Introduction

Python中的属性是用于访问对象的特性或数据的方式,而属性访问器则用于控制如何读取、设置或删除属性。在Python中,通过使用@property装饰器可以将一个属性方法转化为属性。

2. Understanding Attributes

在Python中,属性是与对象相关联的特性或数据。一个对象的属性可以是公共属性(在类定义中定义)或私有属性(在类定义中以双下划线开头)。对象的属性可以通过使用点号运算符来访问。

class Circle:

def __init__(self, radius):

self.radius = radius

c = Circle(5)

print(c.radius) # 输出 5

上述代码中,Circle类有一个radius属性,通过使用点号运算符可以访问到这个属性,并且将其赋值为5。

3. Creating a Property

有时候我们希望在访问属性时执行一些特殊的处理。这时,我们可以使用@property装饰器将一个属性方法转化为属性。

class Circle:

def __init__(self, radius):

self.radius = radius

@property

def diameter(self):

return self.radius * 2

c = Circle(5)

print(c.diameter) # 输出 10

上述代码中,我们定义了一个diameter属性方法,并使用@property装饰器将其转化为属性。当我们访问该属性时,会执行diameter方法,并返回计算得到的结果。

3.1. Getter Method

使用@property装饰器将一个方法转化为属性后,默认情况下,该属性只有getter(获取)方法。这意味着我们可以读取属性的值,但是不能设置属性值。

class Circle:

def __init__(self, radius):

self.radius = radius

@property

def diameter(self):

return self.radius * 2

c = Circle(5)

print(c.diameter) # 输出 10

c.diameter = 12 # 报错:AttributeError: can't set attribute

上述代码中,我们试图为diameter属性设置一个新的值,但是由于该属性只有getter方法,所以会报错。

3.2. Setter Method

如果我们希望能够设置属性的值,我们可以在属性方法上添加一个setter(设置)方法。这样一来,我们既可以读取属性的值,又可以设置属性的值。

class Circle:

def __init__(self, radius):

self.radius = radius

@property

def diameter(self):

return self.radius * 2

@diameter.setter

def diameter(self, value):

self.radius = value / 2

c = Circle(5)

print(c.diameter) # 输出 10

c.diameter = 12

print(c.radius) # 输出 6

上述代码中,我们在diameter属性方法上添加了一个setter方法。当我们设置diameter属性的值时,会执行setter方法,并将值除以2后赋给radius属性。

4. Deleting a Property

除了读取和设置属性的值,有时候我们还希望能够删除属性。通过使用@property装饰器,我们可以定义一个名为<property>.deleter的方法来实现这一功能。

class Circle:

def __init__(self, radius):

self.radius = radius

@property

def diameter(self):

return self.radius * 2

@diameter.deleter

def diameter(self):

del self.radius

c = Circle(5)

print(c.diameter) # 输出 10

del c.diameter

print(c.diameter) # 报错:AttributeError: 'Circle' object has no attribute 'diameter'

上述代码中,我们定义了一个diameter属性的deleter方法。当我们删除diameter属性时,会执行deleter方法,并删除radius属性。

5. Conclusion

通过使用@property装饰器,我们可以将一个属性方法转化为属性,从而在访问属性时执行一些特殊的处理。属性可以有getter、setter和deleter方法,使得我们可以更灵活地读取、设置和删除属性的值。

了解如何将属性方法转化为属性,并合理地使用属性访问器,将帮助我们更好地设计和使用Python对象。

后端开发标签