1

パラメータ化されたオブジェクト属性を何らかのロジックでラップする「メソッド ファクトリ関数」を作成すると便利だと思います。

例えば:

"""Fishing for answers.

>>> one().number_fisher()
'one fish'
>>> one().colour_fisher()
'red fish'
>>> two().number_fisher()
'two fish'
>>> two().colour_fisher()
'blue fish'
"""


class one(object):
    def number(self):
        return 'one'
    def colour(self):
        return 'red'
    def _make_fisher(sea):
        def fisher(self):
            return '{0} fish'.format(getattr(self, sea)())
        return fisher
    number_fisher = _make_fisher('number')
    colour_fisher = _make_fisher('colour')

class two(one):
    def number(self):
        return 'two'
    def colour(self):
        return 'blue'

属性をmake_fisher文字列として渡す必要がありますか、またはこれを行うためのより良い方法はありますか?

実際の属性を渡して使用すると、 のインスタンスがtwo属性オブジェクトへの同じ参照を引き続き使用するため、ポリモーフィズムが壊れます。

IE

diff --git a/fishery.py b/fishery.py
index 840e85d..b98cf72 100644
--- a/fishery.py
+++ b/fishery.py
@@ -4,10 +4,12 @@
 'one fish'
 >>> one().colour_fisher()
 'red fish'
+
+This version does not implement polymorphism, and so this happens:
 >>> two().number_fisher()
-'two fish'
+'one fish'
 >>> two().colour_fisher()
-'blue fish'
+'red fish'
 """


@@ -18,10 +20,10 @@ class one(object):
         return 'red'
     def _make_fisher(sea):
         def fisher(self):
-            return '{0} fish'.format(getattr(self, sea)())
+            return '{0} fish'.format(sea(self))
         return fisher
-    number_fisher = _make_fisher('number')
-    colour_fisher = _make_fisher('colour')
+    number_fisher = _make_fisher(number)
+    colour_fisher = _make_fisher(colour)

 class two(one):
     def number(self):

属性を参照するために文字列を使用する必要があるのは少し弱いようですが、これを行う別の方法は見当たりません。ある?

4

1 に答える 1

2

「もう 1 つのレベルの間接化」(プログラミングの魔法の万能薬として提案されることもあります;-) -- のような典型的なデコレータと同様propertyです。例えば:

def makefisher(fun):
  def fisher(self):
    return '{0} fish'.format(fun(self))
  return fisher

class one(object):
  def number(self): return self._number()
  def _number(self): return 'one'
  number_fisher = makefisher(number)

class two(one):
  def _number(self): return 'two'

基本的に、ラップする関数は、テンプレート メソッド DP の非常に単純なバリアントの「編成関数」であり、オーバーライドする関数は、同じ DP の「フック関数」です。または、少なくとも、それはそれを見る 1 つの方法です。

于 2010-07-31T06:12:30.280 に答える