python使用@property与描述器详解及讨论

本文详细探讨了Python中的@property装饰器和描述器的使用。通过示例解释了如何利用@property创建只读属性,强调了不应过度使用property以避免代码冗余和性能下降。此外,介绍了描述器的概念,包括其get、set、delete方法,以及如何在类装饰器中应用描述器进行类型检查。最后指出,对于简单的属性定制,@property更为便捷,而描述器则在处理大量重复代码或构建库功能时更有优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python使用@property与描述器详解及讨论

描述

python内置的@property函数,可以方便地将类的方法变成类的属性来调用
比如:

class Date(object):
    _year = 0
    
    @property
    def year(self):
        return self._year

    @year.setter
    def year(self, value):
        if isinstance(value, int):
            self._year = value
        else:
            raise TypeError('year must be integer!')

    @year.deleter
    def year(self):
        raise AttributeError("Can't delete attribute")

调用时

>>>d = Date()
>>>d.year  # 触发year.getter
0
>>>d.year = 2020  # 触发year.setter
>>>d.year
2020
>>>d.year = '2020'
TypeError: year must be integer!

若只实现了getter方法,则该属性只读,不可设置

class Date(object):
    _month = 0
    
    @property
    def month(self):
        return self._month

调用时

>>>d = Date()
>>>d.month  # 触发month.getter
0
>>>d.month = 12  # 触发month.setter,由于没有实现setter,默认raise AttributeError
AttributeError: can't set attribute

虽然property函数很好用,但也请注意不要滥用,只有当你确实需要对attribute执行其他额外的操作的时候才应该使用到property,不要写这种没有做任何其他额外操作的property

class Date(object):
    def __init__(self, month=0):
        self._month = month
    
    @property
    def month(self):
        return self._month
    
    @month.setter
    def month(self, value):
        self._month = value

原因在于,这样写会让你的代码变得很臃肿,并且还会迷惑阅读者。 其次,它还会让你的程序运行起来变慢很多。 最后,这样的设计并没有带来任何的好处。 特别是当你以后想给普通attribute访问添加额外的处理逻辑的时候, 你可以将它变成一个property而无需改变原来的代码。 因为访问attribute的代码还是保持原样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值