【问题标题】:python: export method as function close over objectpython:将方法导出为关闭对象的函数
【发布时间】:2012-08-17 10:10:38
【问题描述】:

在 python 中,我想将对象方法导出为普通函数。该对象将被关闭。 如下所示:

from functools import partial

class A(object):
    def __init__(self,a):
        self.a = a

    def m(self,b):
        return self.a+b

    def exportm(self):
        return lambda b,self=self: self.m(b)
        #return partial(self.m,self=self)

f = A(10).exportm()

print f(5)

这很好用,可以按预期打印 15。但是,如果我将 return-lambda-line 替换为注释行,它将失败并出现以下错误:

TypeError: m() got multiple values for keyword argument 'self'

我知道使用 functools 比使用 lambda 表达式更干净。所以我想知道如何使用 functools 中的部分或其他工具来做到这一点。

【问题讨论】:

    标签: python lambda closures partial functools


    【解决方案1】:

    self.m 已经绑定,因此无需将self=self 传递给它。只需返回self.m。如需更多参数,请使用partial(self.m, ...)

    class A(object):
        def __init__(self, a):
            self.a = a
    
        def m(self, b, c):
            return self.a + b + c
    
        def exportm(self):
            return partial(self.m, 300)
    
    f = A(10).exportm()
    print f(5)
    

    【讨论】:

      【解决方案2】:

      关注KISS principle。没有必要使用让你的代码看起来更专业的东西。正如 thg435 已经说过 return self.m 会做的那样。

      您的代码越精简越容易理解,无论是您自己阅读代码时(比如一个月)还是其他开发人员。

      【讨论】:

      • 我同意:对于这个例子,它看起来完全是矫枉过正,但那是因为我把它剥离出来以表明我的观点。
      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      • 2012-10-15
      • 2014-03-12
      相关资源
      最近更新 更多