property在python2和python3中的区别

文章探讨了在从Python2迁移到Python3的过程中遇到的关于`property`使用的不兼容问题。在Python2代码中,不规范的`property`用法在Python3下导致错误。解决方案是遵循Python2和Python3文档中的标准写法,以确保代码的兼容性和正确性。

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

  • 问题背景: 源于公司的原来的代码是python2开发的,后来改为python3开发,设计到的property的用法有点不一样
  • 直接上代码

公司原来的python2的代码

class LineItem:

    def __init__(self, description, weight, price):
        self.description = description
        self.__weight = weight
        self.price = price

    @property
    def weight(self):
        return self.__weight

    @weight.setter
    def set_weight(self, value):
        if value > 0:
            self.__weight = value
        else:
            raise ValueError('weight must be > 0')
PYthon学习企鹅裙:88198-2657  领取python自动化编程资料教程

运行代码

In [2]: l = LineItem('a', 3, 6)

In [3]: l.weight
Out[3]: 3

In [4]: l.weight = 5

In [5]: l.weight
Out[5]: 5

这个代码在python2下面执行没有问题,但是在python3下面执行,会报错,在执行 In [4]: l.weight = 5 的时候报错

In [4]: l.weight = 5
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-3c1df6104a5e> in <module>
----> 1 l.weight = 5

AttributeError: can't set attribute
  • 解决方法

按理说,上面的那种写法不是很规范,无论是在python2还是python3的文档实例里面都不是这么写的,所以为了简便和不出错,我们统一使用下面的这种写法

class LineItem:

    def __init__(self, description, weight, price):
        self.description = description
        self.__weight = weight
        self.price = price

    @property
    def weight(self):
        return self.__weight

    @weight.setter
    def weight(self, value):
        if value > 0:
            self.__weight = value
        else:
            raise ValueError('weight must be > 0')

主要区别在于这一行 def weight(self, value):

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值