首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何访问dunder方法?

如何访问dunder方法?
EN

Stack Overflow用户
提问于 2021-11-29 21:11:02
回答 1查看 57关注 0票数 0
代码语言:javascript
代码运行次数:0
运行
复制
number = 5

print(number.__class__)
print(number.__str__())
print(number.__add__(1))

#Output

<class 'int'>
5
6

我想我是想看看我的理解是否正确。

因此,有不同的方法可以访问dunder方法。在第一种情况下,我似乎正在访问该方法,就好像它是类int的属性一样。在这种情况下,__class__是否使用@property装饰器来访问它,就好像它是一个属性一样?如果是这样的话,这是有道理的。

第二和第三个是有意义的。__str___是在类int中定义的一个不带参数的dunder方法。您可以像调用方法一样调用它。__add__接受一个参数,这是您要添加到参数中的数字。所以你必须像调用带参数的方法一样调用它。所以这些都不使用@property装饰器。

我猜更令人困惑的是,从技术上讲,可以使用@property装饰器将__str__变成属性。我自己在自己的类上测试了它,它肯定可以以任何一种方式工作,所以它看起来有点随意,哪些像属性一样被访问,哪些像方法一样被访问。假设我的理论是正确的。

EN

回答 1

Stack Overflow用户

发布于 2021-11-29 21:17:04

所以有不同的方式来访问

方法。在第一种情况下,我似乎正在访问该方法,就好像它是类int的属性一样。

这是因为__class__是一个属性,而不是一个方法。

另一个需要区分的地方是,访问方法的方式总是相同的。Dunder方法在这一点上并不神奇。在实例和方法名之间使用.。你是仅仅引用这个方法,还是调用它来获得结果,那就是另一回事了。

虽然这是一个理解Python工作原理的合理练习,但请记住,通常不应该直接调用Dunder方法。Python提供了在幕后调用这些方法的其他语法。例如,使用str(number)而不是number.__str__(),使用a + b而不是a.__add__(b)

dunder方法的主要原因是它们允许您在自己的类中覆盖默认行为。它们并不打算被直接调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70161362

复制
相关文章

相似问题

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