【问题标题】:Function returning reference to itself Python函数返回对自身的引用 Python
【发布时间】:2014-05-20 07:32:43
【问题描述】:

以下在Python中有什么实际用途吗?

>>> def a(n):
        print(n)
        return a

甚至:

>>> def a(n):
        print(n)
        return b
>>> def b(n):
        print(n+3)
        return a

【问题讨论】:

  • 你可以像a(3)(4)(5)一样调用a,会打印出3 4 5
  • 我认为这没什么用。无论调用什么函数,都必须已经引用了它。也许是为了稍微缩短代码,但这将是一种非常不寻常的 Python 编写方式。
  • @TimPietzcker 不,it 不会 print 类似的东西,但是如果您在交互式解释器中执行此操作,解释器将尝试打印调用,它恰好由这样的字符串表示。我想你知道这种区别,但太多人不知道,所以如果你不希望这种误解进一步蔓延,请谨慎选择你的措辞......
  • @l4mpi 如果他能够链接调用,则返回的对象是一个函数,除非他使用实现__call__ 的自定义对象。所以,当你在 REPL 中打印/评估它时,我相信它会像 Tim 所示的那样打印。
  • @thefourtheye 你没明白我的意思。当然 REPL 会这样打印它,但是太多人没有意识到这种区别,并认为 python 本身打印返回值。我的观点是,Tims 注释仅在您在交互式解释器中执行代码时才有效,并且描述了交互式解释器的行为,而不是作为一种语言的 python。

标签: python function reference


【解决方案1】:

这是一种常见的做法,可能与函数无关,但在 OOP 中被广泛使用。基本上,只要您不使用 getter(一种返回对象属性的方法)或返回特定的东西,返回对象本身就没有成本。但它允许压缩代码,如

house = House()
exits = house.setDoors(2).setWindows(4).getNumberOfEmergencyExitsRequired()

或者,你必须写

house = House()
house.setDoors(2)
house.setWindows(4)
exits = house.getNumberOfEmergencyExistsRequired()

这不是世界末日,但它允许在不降低可读性的情况下压缩代码,因此这是一件好事。

你的例子

第一个是直截了当且类似的,它允许压缩代码。第二个其实不是我个人会做的,因为

a(3)(5) == a(3); b(5)

在这个简单的例子中,它没有理由表现得那样,而且可能会造成混淆。

返回 OOP

无论如何,在 OOP 中,你当然可以想象

class House(object):
    def addDoorByColor(self, doorColor):
        door = new Door()
        door.setColor(doorColor)
        self.door = door
        return self.door

然后在哪里

house = House(); 
house.addDoorByColor('red').open()

会“开门”。对于这种情况,这可能不是最好的例子,但我现在提出的只是为了表明返回“其他对象”的潜在用途。但是,最后一种情况可能最好由

完成
door = new Door('red')
house.addDoor(door)
door.open()

【讨论】:

  • 这与返回对自身的引用的函数不同。
  • 哼。 -> 在 Python 中不存在。并且在 Python 中常见的是引用同一个对象的引用。
  • 另外,在 Python 中做 OOP 并不常见:P
猜你喜欢
  • 2013-07-06
  • 2017-03-20
  • 2010-10-25
  • 1970-01-01
  • 2022-01-01
  • 2022-11-24
  • 2011-12-29
  • 1970-01-01
  • 2014-07-14
相关资源
最近更新 更多