Python:等价于闭包继承

标签 python oop functional-programming closures

我正在尝试从 OOP 过渡到函数式编程。我遇到以下情况:(变量没有意义 - 它们只是示例)。

Funcs = namedtuple('Funcs', ('func1', 'func2'))

def thing_1(alpha, beta):
    gamma = alpha+beta
    def func_1(x):
        return x+gamma
    def func_2(x):
        return x*gamma
    return Funcs(func_1, func_2)

def thing_2(alpha, beta):
    gamma = alpha+beta
    delta = alpha*beta
    def func_1(x):
        return x+gamma
    def func_2(x):
        return x*gamma+delta
    return Funcs(func_1, func_2)

现在,我们有一些代码重复:func_1 在这两个方面是相同的。这两件事也以相同的方式初始化 gamma。

如果我使用 OOP,很明显该做什么 - 制作一个 BaseThing,制作 func_2 抽象,并让 Thing1 覆盖方法 func_2,和 Thing2 覆盖 func_2 方法和 __init__(它将调用 BaseThing.__init__ 然后初始化 delta)。

使用闭包,这对我来说并不明显 - 做同样事情的最佳方法是什么?

最佳答案

你的具体例子我没看懂,但是更抽象的说,OOP和FP的区别可以概括如下:

  • 面向对象
    • 对象是一个单位
    • 通过虚方法实现参数化
    • 特化是通过继承实现的

换句话说,对象的行为取决于(或“参数化”)它调用的虚拟方法。要修复(或“专门化”)一组特定的“参数”(=方法),您可以扩展该对象。

  • 在计划生育中
    • 功能是一个单元
    • 通过函数参数实现参数化
    • 通过部分应用实现特化

要参数化一个函数,您需要将其他函数传递给它。要修复一组参数,您可以创建一个新函数,该函数是具有部分应用参数的基本函数。

插图:

# OOP style

class Animal:
    def voice(self):
        pass
    def greet(self, person):
        return '%s, %s!' % (self.voice(), person)

class Dog(Animal):
    def voice(self):
        return 'woof'

class Cat(Animal):
    def voice(self):
        return 'meow'

print Dog().greet('master')
print Cat().greet('master')

# FP style

def greet(voice, person):
    return '%s, %s!' % (voice(), person)

from functools import partial

dogGreet = partial(greet, lambda: 'woof')
catGreet = partial(greet, lambda: 'meow')

print dogGreet('master')
print catGreet('master')

关于Python:等价于闭包继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28431201/

相关文章:

ruby - 为什么 ruby​​ 允许子类访问父类的私有(private)方法?

compiler-construction - 递归下降解析器和函数式编程

python - 什么是 pipenv [dev-packages] 部分?

python - 使用给定列表计算欧氏距离

python - 列/行切片 torch 稀疏张量

oop - 命令模式-为什么封装在对象中?

C# - 将 HTML 编写为字符串的面向对象方式?

haskell - 特设多态函数

recursion - 如何根据 reduce 定义 map、filter 和 reverse 等操作?

python - dask DataFrame.assign 炸毁了 dask 图