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

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

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的代码还是保持原样。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@propertyPython中的一个内置修饰符,用于将一个方法变成属性调用。在面向对象编程中,有时候我们希望通过调用对象的属性来获得或设置其值,而不是直接调用方法。这样可以使代码更加简洁和易读。 @property使用方式是,在需要被修饰的方法上方加上@property装饰符。这样,当我们调用对象的该方法时,就会像访问属性一样来访问。 @property修饰的方法通常用于获取属性的值,因此被称为getter方法。此外,我们还可以使用@property来定义setter方法,用于设置属性的值。 @property与getter和setter方法的原理是通过实现特殊的方法来实现的。 对于getter方法,@property将其装饰的方法转换为只读的属性。当我们通过调用该属性时,实际上调用的是被装饰的方法。 对于setter方法,@方法名.setter装饰用来定义一个名字与被装饰方法相同的方法,并通过该方法来修改属性的值。当我们给该属性赋值时,实际上调用的是被装饰的setter方法。 通过getter和setter方法的配合,@property可以使我们在获取和设置属性值时更加灵活和方便。比如,我们可以在setter方法中进行属性值的校验和处理,确保属性值符合预期。 总结起来,@property提供了一种优雅和方便的方式来定义的属性访问方法,使得我们可以像访问属性一样来调用这些方法。它的实现原理是通过装饰和特殊的方法来实现的。这种方式使得代码更加简洁、易读,并且拥有更高的灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值