python中函数和可调用对象之间的区别是什么?

时间:2018-02-19 11:41:56

标签: python

class Adder:
      def __call__(self, x, y):
          return x + y

add1 = Adder()
def add2(x, y):
    return x + y

add1add2除了类型之外还有什么区别?

2 个答案:

答案 0 :(得分:4)

在你的超简单例子中。没有实际的区别,因为函数也是可调用的对象。

但是,可调用对象是您编写的类的对象,因此您可以编写此代码:

class Counter:
    def __init__(self, value = 0):
        self.n = 0

    def __call__(self):
        self.n += 1
        return self.n

    def __repr__(self):
        return str(self.n)

redWins = Counter()
blueWins = Counter()

if foo():
    redWins()
else:
    blueWins()

print("Red has won {} times.\nBlue has won {} times."
      .format(redWins, blueWins))

你会发现很难仅使用函数来实现这样的类。即使您尝试使用全局变量,也不能拥有单个全局变量的单独实例。

查看更多:Functions, Callable Objects, and how both are created in Python

答案 1 :(得分:3)

在您的示例中,没有功能差异,但由于<div id="mytabs"> <ul class="nav nav-tabs" id="tabs"> <li class="active"><a data-toggle="tab" href="#Personal" aria-expanded="false">Personal</a></li> <li><a data-toggle="tab" href="#Business">Business</a></li> <li><a data-toggle="tab" href="#Documents" aria-expanded="true">Documents</a></li> <li><a data-toggle="tab" href="#References">References</a></li> <li><a data-toggle="tab" href="#OrderDelivery">Order &amp; Delivery</a></li> </ul> </div> 是一个对象,您可以将信息存储在成员中:

add1

您获得class Adder: def __init__(self): self.__memory = 0 def __call__(self, x, y): self.__memory += x return x+y+self.__memory add1 = Adder() print(add1(10,10)) print(add1(10,10)) 然后30。你可以用一个函数做到这一点,但是你需要一个全局变量,并且使用全局变量确实是在寻找麻烦。