python - Magic Method (__iter__ __call__)

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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值