📜  @property python (1)

📅  最后修改于: 2023-12-03 14:38:56.405000             🧑  作者: Mango

@property Python

在Python中,@property是一个内置的装饰器,用于将一个方法转换为类的属性。它提供了一种简洁的方式来实现封装和数据隐藏,同时在访问和设置属性时提供更多的控制。

基本用法

使用@property装饰器的基本用法是将一个方法定义为只读属性。以下是一个例子:

class Circle:
    def __init__(self, radius):
        self.radius = radius
    
    @property
    def diameter(self):
        return self.radius * 2

在上面的例子中,diameter方法被装饰为属性。我们可以通过调用该方法来获取圆的直径,就像访问一个普通的属性一样:

circle = Circle(5)
print(circle.diameter)  # 输出:10
属性的访问器和设置器

@property装饰器还可以在类中定义属性的访问器(getter)和设置器(setter)。访问器用于获取属性的值,而设置器用于设置属性的值。以下示例说明了如何使用访问器和设置器:

class Temperature:
    def __init__(self, celsius):
        self._celsius = celsius
    
    @property
    def celsius(self):
        return self._celsius
    
    @celsius.setter
    def celsius(self, value):
        if value < -273.15:
            raise ValueError("Temperature cannot be below absolute zero.")
        self._celsius = value
    
    @property
    def fahrenheit(self):
        return self._celsius * 9 / 5 + 32

在上面的例子中,我们定义了celsius属性的访问器和设置器。celsius访问器返回私有变量_celsius的值,而设置器允许我们设置新的温度值,同时进行有效性检查。此外,我们还定义了一个只读属性fahrenheit,它通过访问celsius属性来计算华氏温度。

temp = Temperature(25)
print(temp.celsius)     # 输出:25
print(temp.fahrenheit)  # 输出:77

temp.celsius = 30
print(temp.celsius)     # 输出:30
print(temp.fahrenheit)  # 输出:86

temp.celsius = -300    # 抛出异常:ValueError: Temperature cannot be below absolute zero.
内置属性方法

@property装饰器还提供了其他一些内置的属性方法,用于更灵活地控制属性的行为。这些方法包括gettersetterdeletergetter.setter。以下是示例:

class User:
    def __init__(self, username):
        self._username = username
    
    @property
    def username(self):
        return self._username
    
    @username.getter
    def username(self):
        return self._username.capitalize()
    
    @username.setter
    def username(self, value):
        if not value.isalnum():
            raise ValueError("Username must be alphanumeric.")
        self._username = value
    
    @username.deleter
    def username(self):
        raise AttributeError("Cannot delete username.")
    
    @property
    def length(self):
        return len(self._username)

user = User("john")
print(user.username)  # 输出:John

user.username = "johnsmith"
print(user.username)  # 输出:Johnsmith

print(user.length)    # 输出:10

del user.username     # 抛出异常:AttributeError: Cannot delete username.

上面的例子展示了如何使用@property装饰器的其他属性方法。getter方法可以对属性进行额外的处理,setter方法可以进行有效性检查,而deleter方法可以阻止属性的删除。

总结

@property装饰器是一个强大的工具,可以帮助程序员在实现面向对象编程时更好地控制属性的访问和设置。它提供了简洁、优雅的代码实现方式,同时增强了Python类的封装性和可读性。

请注意,上述示例中的代码片段可能需要根据实际情况进行适当的修改和扩展。