Python中整数与@property属性值运算报错的问题排查
问题分析与解决
错误原因
你的代码有两个核心问题:
- @property方法缺少self参数:@property装饰的实例属性getter方法必须接收
self参数,否则Python无法将其绑定到实例,也无法正确触发属性值的获取逻辑。 - 错误地直接访问类上的property对象:
A.att是直接取类上的property实例,而不是通过实例访问属性值——@property默认是给实例用的,直接访问类上的property不会调用getter返回数值,自然就会出现int和property类型无法运算的错误。
另外,类私有变量__att在getter里要通过A.__att访问(因为它是类级别的变量),如果是实例私有变量才用self.__att。
修正后的代码
方案1:实例属性版(最常用)
class A: __att = 3 @property def att(self): # 必须添加self参数 return A.__att def test_method(self): return 3 * self.att # 通过实例self访问@property属性,获取数值 a = A() x = a.test_method() print(x) # 输出9
方案2:类属性版(Python3.9+支持)
如果想直接通过类A.att获取数值,可以结合@classmethod和@property:
class A: __att = 3 @classmethod @property def att(cls): return cls.__att def test_method(self): return 3 * A.att # 此时A.att会返回数值3 a = A() x = a.test_method() print(x) # 输出9
补充说明
@property的"透明访问"是针对实例而言的——当你通过实例.属性名访问时,会自动调用getter方法返回值;但直接访问类.属性名拿到的是property对象本身,除非你用类装饰器把它改成类级别的属性访问器。
内容的提问来源于stack exchange,提问作者massi
相关产品推荐
相关产品推荐

