有关Python中默认类函数的问题

时间:2018-11-23 16:51:41

标签: python class methods

考虑下面的迭代类示例,该类根据给定的数字进行阶乘:

import math

class Factorial(object):
  def __init__(self, num, maxsize=10e12):
    self.num = num
    self.maxsize = maxsize
  def __repr__(self):
    if __name__ == '__main__':
      return f'<{self.__class__.__name__} object at {hex(id(self.__class__))}>'
    else:
      return '<' + self.__class__.__module__ + '.' + self.__class__.__name__ + ' object at ' + hex(id(self.__class__)) + '>'
  def __iter__(self):
    for i in range(1,self.num+1):
      if math.factorial(i) > self.maxsize:
        break
      yield math.factorial(i)

因此,我们当然有方法__init____repr____iter__,我在网上都读过它们。我有两个问题:

  1. 您将如何称呼这些方法?我知道您可以将__init__描述为一种构造函数,但是对于类来说,所有这些__<blah>__方法都属于一个特殊的名称吗?

  2. 是否存在所有这些所谓的“特殊”或“内置”类函数的列表,以告知它们是什么以及它们在类上下文中的作用?我已经知道的是__init____enter____next____exit____iter____str____repr____call__。还是这是一个完整的列表,除了少数几个?

我已经为此花了一段时间了(主要是因为我不知道如何调用这些函数,所以我无法真正研究它们)。

1 个答案:

答案 0 :(得分:1)

由于无法回答这个合理的问题,因此,我将这些评论中给出的建议总结为社区Wiki。

Python官方文档大多将__init____iter__之类的方法称为“特殊方法”。它有一个in its chapter on the Python data model列表。

Python程序员经常使用不太正式的术语“魔术方法”。或者,由于名称周围有双下划线,因此“ dunder方法”一词可能有意义,尤其是当您需要大声说出它们的名称时(您可以简单明了地说“ dunder init”表达名称__init__而不用打结的方式,一种方法popularized by Ned Batchelder)。

值得注意的是,某些对象具有特殊的属性,这些属性实际上不是方法。例如,函数和模块的__name__属性是字符串。 (模块的__name__可用作模块内的全局变量,并且您经常会在if __name__ == "__main__"样板中看到这种用法。)所有对象都应具有__class__属性(即对其类型的引用),并且许多都将具有__dict__属性(字典)。