@property的使用方法

使用 @property 装饰器可以将一个方法转换为属性。这意味着你可以通过直接访问属性的方式来获取方法的返回值,而不需要使用方法调用的语法。

假设我们有一个类 Circle,其中定义了一个方法 get_radius() 来获取半径值:

class Circle:
    def __init__(self, radius):
        self._radius = radius

    def get_radius(self): # 为了获取属性值radius特意定制的一个方法
        return self._radius

如果我们想要获取半径值,通常需要调用方法:

circle = Circle(5)
radius = circle.get_radius()  # 调用上面特意定制的方法来获取实例对象circle的半径值
print(radius)  # 输出:5

但是,如果我们将之前特意定制 get_radius() 方法替换掉,使用 @property 装饰器,就可以直接对属性radius进行访问并修改:

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self): #这个radius就是初始化函数中的radius属性
        return self._radius   #返回实例对象的属性

现在我们可以直接访问 radius 属性来获取半径值,就像访问普通属性一样:

circle = Circle(5)
radius = circle.radius  # 直接访问属性来获取半径值
print(radius)  # 输出:5

这样,我们就可以使用属性访问的方式来获取方法的返回值,使代码更加简洁和易读。

如果我们使用了@property对一个属性进行了装饰之后,如果要需要修改该实例对象的circle属性(之前是5),就不能够直接使用circle.radius=2这样子来随便修改属性

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        return self._radius

circle=Circle(5)
print(circle.radius)

circle.radius=2   #这样修改实例对象的属性是错误的,会出现报错
print(circle.radius)

会出现下面这个报错

D:\Anaconda\envs\pytorch\python.exe D:\Pycharm_code\pythonProject64\main.py 
4
Traceback (most recent call last):
  File "D:\Pycharm_code\pythonProject64\main.py", line 19, in <module>
    A1.radius=2
AttributeError: can't set attribute

Process finished with exit code 1

这个时候我们就需要使用@property的配套的装饰器@你要修改的属性.setter来设置当前实例对象的属性radius的新值

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        return self._radius

    @radius.setter  #对属性radius设置一个setter装饰器
    def radius(self, value):
        if value < 0:
            raise ValueError("Radius cannot be negative.")
        self._radius = value

circle=Circle(5)
print(circle.radius)  #输出为5

circle.radius=2
print(circle.radius)    #新的属性输出为2

综上所述,当属性没有使用 @property 装饰器时,通常需要使用类似于 circle.radius 的语法来直接访问实例对象的属性值。这种方式只能用于获取属性值,而不能用于修改属性值。,如果需要修改属性值的话就需要用到@属性.setter来修改,这个属性的id由你要修改的属性决定,所以使用 @property 装饰器的一个主要作用就是可以提供更加直观和方便的属性访问语法,使属性的获取和修改都可以通过类似于访问属性的方式来进行,增加了代码的可读性和易用性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值