使用@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 可以帮助我们更好地控制对象的状态,同时保持代码的简洁性和易读性。这是面向对象编程中一个非常有用的特性,特别是在需要对属性进行额外处理或验证的情况下。