4

次の Python クラスがあります。

class class A:
    """a class that increments internal variable"""
    def __init__(self, x):
        self._x = x
    def incr(self):
        self._x = (self._x + 1) % 10
        return self._x

コンストラクターと別のメソッドだけを持つそのようなクラスは、実際には関数に置き換えるだけでよいという話を聞いたことがあります。

だからここに私の試みがあります(Python 2.7の場合):

def incrX(x): 
    """closure that increments internal variable"""
    d = {'x' : x}
    def incr():
        d['x'] = (d['x'] + 1) % 10
        return d['x'] 
    return incr

それを実行する:

def test1():
    """testing closure vs. class"""
    print 'class...'
    a = A(10)
    print a.incr()
    print a.incr()

    print 'closure...'
    incr = incrX(10)
    print incr()
    print incr()

$ python closure.py 
running closure experiments
class...
1
2
closure...
1
2

だから私の質問は:

A のようなクラスをクロージャに置き換えるメリットはありますか? クロージャーをよりよく理解しようとしているだけです。

4

2 に答える 2

5

クロージャーと高階関数の本当の利点は、プログラマーが時々考えていることを表現できることです。プログラマーとして、頭にあるのはコード、関数、何かを計算する (または何かを実行する) 方法に関する命令であることに気付いた場合は、これにクロージャーを使用する必要があります。

一方、あなたが念頭に置いているものがオブジェクト、つまりモノ (たまたまいくつかのプロパティ、メソッド、命令、機能などを持っている) に似ている場合は、それをオブジェクト、クラスとしてプログラムする必要があります。

あなたの場合、これを実装する最良の方法はどちらでもないと思います;-)私はジェネレーターでこれを行います:

def incrX(i):
  while True:
    i += 1
    i %= 10
    yield i

incr = incrX(10)
print incr.next()
print incr.next()
于 2013-09-30T09:07:00.203 に答える