ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python @property 装饰器:避免 TypeError: ‘int‘ object is not callable 错误

Python @property 装饰器:避免 TypeError: ‘int‘ object is not callable 错误 本文深入钻研了中装饰器的恰当运用方式, 尤其是怎样规避常见的: ‘int’并非错误。文章会细致阐释该错误出现的缘由——试图把属性当作方法那般调用, 并且给出了访问属性的正确语法。另外, 还会修正常见的错误实现, 引导读者构建稳固、契合风格的确类属性。装饰器简介。首先这是在中, 装饰器, 它提供了一种方式。这种方式是优雅的, 能把类的方法转去成为特殊方法。这个特殊方法可以像属性那样被访问。它还允许我们去定义实例属性的获取器方法, 还有设置器方法, 以及删除器方法。通过这些方法能实现属性的封装, 还有验证。并且不用直接就把内部的数据暴露出来。这么一举动, 会让类的接口变得更加简洁, 也更加直观。同时还能提供对于属性访问的精细控制。例如一个使用 的 方法其行为就像一个普通属性class MyClass: def __init__(self, value): self._value value property def tenvalue(self): 这是一个getter方法访问时就像访问属性一样 return self._value * 10 obj MyClass(10) # 访问 tenvalue 就像访问普通属性一样不需要括号 print(obj.tenvalue) # 输出 100: int is not 错误解析于你运用 装饰器所定义的属性之际, 若试着那般如同调用方法一样于其后面添加上括号 (), 便会引发 : int 并非 错误。让我们分析原始代码中错误发生的原因class MyClass: # ... (省略其他代码) property def tenvalue(self): return self._value * 10 # ... (省略其他代码) obj MyClass(10) # ... obj.tenvalue() # 错误发生在这里由于被 装饰, 所以它属于属性访问而非方法调用, 这表明它是一个属性, 并非普通方法。当进行 obj. 操作时, 会执行 的 方法 ( self. * 10) 并返回其结果。其返回值为整数, 比如在obj (10) 此例子中, obj. 的 方法会返回10 * 10 100。又因为属性这样被定了, 那就意味着尝试调用整数的操作会致使表达式obj.() 实际上变为100()。因为, 100属于整数范畴乃是int类型, 并非那种可予以调用的对象呀, 诸如函数或者方法之类的, 所以就会抛出这样的错误, 即: ‘int’ is not 错误。简要来讲, 的用途为何, 是要使你得以用属性这样的形式去访问一个经计算得出的值, 并非是以方法那样的形式去调用它。正确使用 想要正确地去访问那由 装饰的属性, 仅仅如此这般, 就如同去访问常规的实例属性那样, 是不需要加上括号的, 即可按此操作:obj MyClass(10) # 正确访问方式直接引用属性名 print(obj.tenvalue) # 输出 100 的常见陷阱与最佳实践除却 的运用之外, 还准许我们界定 方法, 用来操控属性的赋值作为。原先的代码里的 实现具备个别问题, 接下来我们着手剖析并给出最佳实践。度加AI度加AI的官网入口, 是来自百度官方的AIGC创作平台, 它具备支持AI成片的能力, 拥有AI生文的本领, 还有数字人功能, 能实现声音克隆操作, 能进行配音字幕工作, 以及具备智能剪辑方面的在线创作能力。下载1. 的作用将特定逻辑放到属性被赋值之际去执行, 这便是方法的目的所在, 像数据验证、类型转换或者更新内部状态之类的, 都在此列。它不该具备返回值, 在于其关键作用乃是对对象的状态作出修改。2. 原始 的问题分析原始代码中的 如下tenvalue.setter def tenvalue(self, nv: int): self.name nv # 问题1错误地设置了不存在的 name 属性 return nv * 10 # 问题2setter 不应有返回值且此返回值被忽略3. 属性赋值时的 Typo 陷阱原始代码中还存在一个容易被忽视的 typoobj.tenvalues 22 # 注意这里是 tenvalues多了一个 s这里把obj.赋予22这个值。鉴于其中并未定义名为的属性或者, 会于obj实例之上动态构建一个新的属性并将其赋值成22。这不会引发属性的, 因为属性名称不相符。完整示例与最佳实践下面是一个已修正的定义, 它展示了的正确之处以及实现情况, 还讲授了怎样正确运用它们: 。class MyClass: def __init__(self, value): self._value value # 内部私有属性通常以单下划线开头 def show(self): 显示内部值的方法 print(f当前内部值: {self._value}) property def tenvalue(self): tenvalue 的 getter 方法 访问时如 obj.tenvalue返回 _value 的10倍。 print(f正在获取 tenvalue...) return self._value * 10 tenvalue.setter def tenvalue(self, new_ten_value: int): tenvalue 的 setter 方法 当 obj.tenvalue X 被调用时执行。 负责根据传入的“10倍值”更新内部 _value。 print(f正在设置 tenvalue 为 {new_ten_value}...) if not isinstance(new_ten_value, (int, float)): raise TypeError(tenvalue 必须是数字类型) # 将传入的10倍值转换回原始值并更新 _value self._value int(new_ten_value / 10) print(f内部 _value 已更新为 {self._value}) # 实例化对象 obj MyClass(10) obj.show() # 输出: 当前内部值: 10 # 访问 tenvalue 属性 (触发 getter) print(fobj.tenvalue {obj.tenvalue}) # 输出: 正在获取 tenvalue... obj.tenvalue 100 # 修改 tenvalue 属性 (触发 setter) # 假设我们想让内部 _value 变为 22那么传入的 tenvalue 应该是 220 obj.tenvalue 220 obj.show() # 输出: 正在设置 tenvalue 为 220... 内部 _value 已更新为 22 当前内部值: 22 # 再次访问 tenvalue 属性确认值已更新 print(fobj.tenvalue {obj.tenvalue}) # 输出: 正在获取 tenvalue... obj.tenvalue 220 # 尝试错误调用方式 (会导致 TypeError) try: obj.tenvalue() except TypeError as e: print(f捕获到错误: {e}) # 输出: 捕获到错误: int object is not callable总结对于编写高质量代码而言, 关键在于掌握装饰器的正确使用。请记住以下几点:通过依照这些最佳实践, 您能够有效地借助 去创建更为封装的, 维护起来更便捷且符合风格的类。免费学习笔记深入立即使用在学习笔记中你将探索 的核心概念和高级技巧
返回列表