首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用@property装饰器和dunder方法

使用@property装饰器和dunder方法
EN

Stack Overflow用户
提问于 2021-10-07 14:52:40
回答 1查看 30关注 0票数 0

在调试一些代码时,我发现使用@property装饰器时出现了意外的行为。简化版如下:

代码语言:javascript
复制
class TestClass:

    @property
    def __len__(self):
        return 6


test_instance = TestClass()
print(len(test_instance))

我原本希望输出6,但是我得到了一个TypeError:TypeError: 'int' object is not callable

在没有属性装饰器的情况下,它可以正常工作。我也可以print(test_instance.__len__)没有问题。我正在努力弄清楚为什么会出现这种情况,并希望有人能用简单的术语解释一下。

Edit:对于非dunder方法,这也是我所期望的:

代码语言:javascript
复制
class TestClass:

    @property
    def foobar(self):
        return 6


test_instance = TestClass()
print(test_instance.foobar)

6如预期的那样打印。我的理解是,len(Class)是调用__len__方法的语法糖,这就是我在这里感到困惑的原因

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-07 14:57:13

len尝试调用test_instance.__len__,但现在它是一个属性,该属性access的计算结果是6,而不是函数。

如果您只是想让TestClass实例的硬编码长度为6,那么就不要使用属性。

代码语言:javascript
复制
class TestClass:
    def __len__(self):
        return 6
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69483263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档