【问题标题】:What are the unique methods of a class called?一个类的独特方法是什么?
【发布时间】:2018-05-09 20:26:38
【问题描述】:

假设你有一个类,并且你将它定义为:

class A:
    pass

当你使用该功能时:

dir(A)

返回类包含的所有方法和属性:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

我的问题是,在它们之前和之后带有双下划线的方法是什么,例如__class____delattr____dict____init__,调用?我假设它们被称为构造函数,但经过研究 - 似乎该术语仅指__init__ 函数。有谁知道是否有特定的类别可以调用这些方法?

【问题讨论】:

  • dunder 方法,用于 double underscore。
  • 搜索了一下,发现了“神奇的方法”,但无论如何,这就是我所需要的

标签: python python-3.x oop naming


【解决方案1】:

这些由所谓的special methodsspecial attributes 组成。根据语言规范,这是这些方法和属性的正式名称。

the Python glossary 中,您可以看到他们的条目:

特殊方法

Python 隐式调用的方法,用于对类型执行特定操作,例如加法。 此类方法的名称以双下划线开头和结尾。特殊方法记录在Special method names

Magic 和 dunder(方法)是社区中另外两个常用的术语。


作为旁注,值得一提的是dir 确实报告所有这些。

【讨论】:

    【解决方案2】:

    他们被称为special method names

    特殊方法名称

    类可以通过定义具有特殊名称的方法来实现由特殊语法调用的某些操作(例如算术运算或下标和切片)。这是 Python 的运算符重载方法,允许类根据语言运算符定义自己的行为。

    special attributes:

    下面的一些类型描述包含一个列出“特殊属性”的段落。这些属性提供对实现的访问,不适合一般用途。

    以双下划线开头并以双下划线结尾的名称是保留名称。见Reserved classes of identifiers

    __*__
    系统定义的名称。这些名称由解释器及其实现(包括标准库)定义。当前系统名称在Special method names 部分和其他地方进行了讨论。在 Python 的未来版本中可能会定义更多内容。 任何__*__ 名称的使用,在任何情况下,如果不遵循明确记录的使用,可能会在没有警告的情况下被破坏。

    它们有时被称为 dunder 名称,作为双下划线的缩写。 魔法名称也是他们的一个流行术语,但都不是官方的。

    注意__init__ 方法是实例initialiser hook,它不是构造函数。在调用此方法时,该实例已经构建完毕。如果您需要连接到构造,请实现__new__ method

    【讨论】:

    • 你应该提一下magic method这个词,即使它只是非官方的,但它被大量使用。伊莫。
    • 也许还有一个注释,“明确记录的使用”包括仅在类上定义它们,而不是在实例上定义它们?
    • @MadPhysicist:不确定我们需要详细说明。
    • 很公平。我想它甚至与问题的字母没有直接关系。
    猜你喜欢
    • 1970-01-01
    • 2013-08-25
    • 2011-03-14
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    相关资源
    最近更新 更多