使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。
class Server():
def get_name(self):
return 'a'
@property
def start(self):
return 'a'
obj = Server()
# 不加property,调用方法要加括号
print(obj.get_name())
# 加property,调用方法不需要加括号
print(obj.start)
在 Python 中,property
是一个内置的装饰器,用于封装类的属性访问。使用 property
可以让我们以一种更优雅的方式控制对对象属性的访问,而无需暴露内部实现细节。通过 property
,我们可以定义只读属性、可写属性以及删除属性的行为。
基本用法
假设我们有一个简单的 Person
类,它有一个私有变量 _name
用于存储人的名字。我们可以使用 property
来提供对外部访问这个变量的方法。
class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
"""The name property."""
print("Getting name")
return self._name
@name.setter
def name(self, value):
print("Setting name to", value)
if not isinstance(value, str):
raise TypeError('Name must be a string.')
self._name = value
@name.deleter
def name(self):
print("Deleting name")
del self._name
在这个例子中:
- @property
装饰器将 name
方法标记为一个 getter,允许我们像访问普通属性一样访问它。
- @name.setter
装饰器定义了如何设置 name
属性的值。这里我们添加了一些类型检查来确保新值是一个字符串。
- @name.deleter
装饰器定义了删除 name
属性时的行为。
使用示例
p = Person("Alice")
print(p.name) # 输出: Getting name\nAlice
p.name = "Bob" # 输出: Setting name to Bob
print(p.name) # 输出: Getting name\nBob
del p.name # 输出: Deleting name
只读属性
如果你想要创建一个只读属性(即只有 getter 没有 setter),你可以省略 @name.setter
部分:
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def area(self):
"""Calculate the area of the circle."""
return 3.14 * (self._radius ** 2)
c = Circle(5)
print(c.area) # 输出: 78.5
在这个例子中,area
是一个只读属性,因为它没有对应的 setter 方法。尝试给 area
设置值将会引发错误。
总结
使用 property
可以帮助我们更好地控制对象的状态,同时保持代码的简洁性和易读性。这是面向对象编程中一个非常有用的特性,特别是在需要对属性进行额外处理或验证的情况下。