【问题标题】:How are dunder methods accessed?如何访问 dunder 方法?
【发布时间】:2022-01-06 16:42:34
【问题描述】:
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 装饰器。

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

【问题讨论】:

标签: python oop python-decorators


【解决方案1】:

所以有不同的方法可以访问 dunder 方法。在第一种情况下,看起来我正在访问该方法,就好像它是 int 类的属性一样。

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

另一个区别是您访问方法的方式始终相同。 Dunder方法在这方面并不神奇。您在实例和方法名称之间使用.。无论您是仅引用该方法还是调用它以获取其结果是另一回事。

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

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

【讨论】:

    猜你喜欢
    • 2020-10-25
    • 1970-01-01
    • 2016-01-06
    • 2017-11-10
    • 1970-01-01
    • 2021-03-10
    • 2019-01-15
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多