Python 从attribute到property详解
在Python中,对象的属性可以分为两种:attribute和property。attribute是对象中的数据成员,而property是通过一定的计算或方法获取的数据成员。
attribute
attribute是对象中的数据成员,直接访问得到的值就是attribute的值。
示例代码:
class Person:
def __init__(self, name):
self.name = name
person = Person('Alice')
print(person.name) # 直接访问属性
输出结果为:Alice
property
property是通过一定的计算或方法获取的数据成员,使用property装饰器可以将方法转换为属性。
示例代码:
class Circle:
def __init__(self, radius):
self.radius = radius
@property
def area(self):
return 3.14 * self.radius ** 2
circle = Circle(5)
print(circle.area) # 直接访问属性
输出结果为:78.5
上述示例中,area
是一个方法,但使用@property装饰器后可以直接访问circle.area
,就像访问attribute一样。
此外,可以使用@property装饰器定义只读属性,以及结合setter和deleter方法实现可读可写的属性。
示例代码:
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.title()
person = Person('alice')
print(person.name) # 直接访问属性
person.name = 'Bob'
print(person.name) # 直接访问属性
person._name = 'eve'
print(person.name) # 直接访问属性
del person.name
print(person.name) # 直接访问属性
输出结果为:
Alice
Bob
Eve
Traceback (most recent call last):
File "test.py", line 18, in <module>
print(person.name) # 直接访问属性
AttributeError: 'Person' object has no attribute '_name'
上述示例中,name
是可读可写的属性,使用setter方法将传入的值转换为首字母大写的形式,使用deleter方法删除属性后再次访问会抛出AttributeError
异常。
总结
Python中的attribute和property都是对象的数据成员,但property是能够进行一定计算或方法调用得到的值。使用@property装饰器可以将方法转换为属性, setter和deleter方法配合@property可实现可读可写的属性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 从attribute到property详解 - Python技术站