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__
变成属性。我自己在自己的类上测试了它,它肯定可以以任何一种方式工作,所以它看起来有点随意,哪些像属性一样被访问,哪些像方法一样被访问。假设我的理论是正确的。
发布于 2021-11-29 13:17:04
所以有不同的方式来访问
方法。在第一种情况下,我似乎正在访问该方法,就好像它是类
int
的属性一样。
这是因为__class__
是一个属性,而不是一个方法。
另一个需要区分的地方是,访问方法的方式总是相同的。Dunder方法在这一点上并不神奇。在实例和方法名之间使用.
。你是仅仅引用这个方法,还是调用它来获得结果,那就是另一回事了。
虽然这是一个理解Python工作原理的合理练习,但请记住,通常不应该直接调用Dunder方法。Python提供了在幕后调用这些方法的其他语法。例如,使用str(number)
而不是number.__str__()
,使用a + b
而不是a.__add__(b)
。
dunder方法的主要原因是它们允许您在自己的类中覆盖默认行为。它们并不打算被直接调用。
https://stackoverflow.com/questions/70161362
复制相似问题