考虑下面的迭代类示例,该类根据给定的数字进行阶乘:
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__
,我在网上都读过它们。我有两个问题:
您将如何称呼这些方法?我知道您可以将__init__
描述为一种构造函数,但是对于类来说,所有这些__<blah>__
方法都属于一个特殊的名称吗?
是否存在所有这些所谓的“特殊”或“内置”类函数的列表,以告知它们是什么以及它们在类上下文中的作用?我已经知道的是__init__
,__enter__
,__next__
,__exit__
,__iter__
,__str__
,__repr__
和__call__
。还是这是一个完整的列表,除了少数几个?
我已经为此花了一段时间了(主要是因为我不知道如何调用这些函数,所以我无法真正研究它们)。
答案 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__
属性(字典)。