What is python Magic Method
Python Magic Method - 简书
https://www.jianshu.com/p/23f05259872a
Python魔法方法(magic method)细解几个常用魔法方法(上) - piperck - 博客园
https://www.cnblogs.com/piperck/p/6354263.html
__iter__()
原文:Python __iter__ 深入理解 - 简书 high quality !
e.g.1
class Fib:
def __init__(self, max):
self.max = max
def __iter__(self):
print('__iter__ called')
self.a = 0
self.b = 1
return self
def __next__(self):
print('__next__ called')
fib = self.a
if fib > self.max:
raise StopIteration
self.a, self.b = self.b, self.a + self.b
return fib
for i in Fib(3):
print(i)
# 输出
__iter__ called
__next__ called
0
__next__ called
1
__next__ called
1
__next__ called
2
__next__ called
定义 __iter__ 表示这个类是一个迭代器(iterator)。它只在迭代开始的时候运行一次。返回的是对象本身。
e.g.2
# 等差数列公式 an = a1 + (n-1) * d
class Acu():
def __init__(self, a1, d, n):
self.a1 = a1
self.d = d
self.n = n
def __iter__(self):
print('iter---------')
return self
def __next__(self):
an = self.a1
if an > self.n:
raise StopIteration
else:
self.a1 += self.d
return an
for i in Acu(1, 2, 15):
print(i)
iter---------
1
3
5
7
9
11
13
15
__call__()
为了将一个类实例当做函数调用,我们需要在类中实现__call__()方法。
也就是我们要在类中实现如下方法:def __call__(self, *args)。这个方法接受一定数量的变量作为输入。假设x是X类的一个实例, 那么调用x.__call__(1,2)等同于调用x(1,2)。
这个实例本身在这里相当于一个函数。
Python中的__init__()和__call__()函数_正西风落叶下长安-CSDN博客_call
class TestCall(object):
def __init__(self, name):
self.name = name
def __call__(self, *args, **kwargs):
print("self.name: %s. " % self.name, end=' ')
print('__call__() is running ')
if __name__ == '__main__':
call = TestCall(name='xiaoming')
call()
# the same as:
call.__call__()
self.name: xiaoming. __call__() is running
self.name: xiaoming. __call__() is running
当一个类型实现了特殊方法
__call__
,该类的实例就变成了可调用的类型,对象名() 等价于 对象名
.__call__()
,有时候可以简化对象的调用,让对象变成可调用的对象, 实现__call__即可。
python 中 __call__简单介绍_阿常呓语的专栏-CSDN博客
class Fib(object):
def __call__(self, num, *args, **kwargs):
n, m, lst = 0, 1, []
for i in range(num):
lst.append(n)
n, m = m, n + m
return lst
f = Fib()
print(f(10))
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]