python 装饰器@property 用法及案例增删改查

在Python中,@property装饰器允许你将类的方法当作属性来访问,从而实现属性的封装和验证。对于增删改查(CRUD)操作,你可以结合@property@<属性名>.setter@<属性名>.deleter装饰器来定义相应的方法。

下面是一个完整的例子,展示了如何使用这些装饰器来实现一个简单的CRUD接口:

class Person:
    def __init__(self, name, age):
        self._name = name  # 私有属性,用于存储姓名
        self._age = age    # 私有属性,用于存储年龄

    # 定义获取姓名的方法,使用@property装饰器
    @property
    def name(self):
        return self._name

    # 定义设置姓名的方法,使用@<属性名>.setter装饰器
    @name.setter
    def name(self, value):
        if not isinstance(value, str):
            raise ValueError("Name must be a string")
        self._name = value

    # 定义获取年龄的方法,使用@property装饰器
    @property
    def age(self):
        return self._age

    # 定义设置年龄的方法,使用@<属性名>.setter装饰器
    @age.setter
    def age(self, value):
        if not isinstance(value, int) or value < 0:
            raise ValueError("Age must be a non-negative integer")
        self._age = value

    # 定义删除年龄属性的方法(注意:通常不建议删除属性,这里仅作为示例)
    # 使用@<属性名>.deleter装饰器
    @age.deleter
    def age(self):
        del self._age
        # 可以选择设置一个默认值或者抛出异常,这里我们仅仅删除了属性
        # 但在实际使用中,可能需要更复杂的逻辑来处理属性删除

# 使用示例
person = Person("Alice", 30)

# 查(Read)
print(person.name)  # 输出: Alice
print(person.age)   # 输出: 30

# 增/改(Create/Update),这里使用相同的setter方法
person.name = "Bob"
person.age = 25
print(person.name)  # 输出: Bob
print(person.age)   # 输出: 25

# 尝试设置非法的年龄值将引发异常
# person.age = -5  # ValueError: Age must be a non-negative integer

# 删(Delete),注意:通常不建议这样做,因为可能会破坏对象的状态
# 在这个例子中,删除age属性后,再尝试访问它将引发AttributeError
del person.age
# print(person.age)  # AttributeError: 'Person' object has no attribute '_age'

# 需要注意的是,删除属性后,对象可能处于不一致的状态,
# 因此在实际应用中应该谨慎使用@<属性名>.deleter装饰器。

然而,需要强调的是,在实际应用中,删除属性通常不是一个好的做法,因为它可能会破坏对象的状态和封装性。在这个例子中,我们仅仅是为了展示@<属性名>.deleter装饰器的用法而包含了删除属性的方法。在大多数情况下,你应该避免删除对象的属性。

另外,请注意,在删除_age属性后,再尝试访问age属性将会引发AttributeError,因为age属性的getter方法试图访问一个已经不存在的私有属性_age。在实际应用中,如果你确实需要删除某个属性,你应该考虑在删除后设置一个合理的默认值或者抛出异常来通知调用者属性已被删除。

posted @ 2024-12-20 15:04  公子Learningcarer  阅读(3)  评论(0编辑  收藏  举报