2010-07-31 3 views
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의 인스턴스가 여전히 해당 속성 객체에 대한 동일한 참조를 사용하므로 다형성을 깨뜨릴 수 있습니다.

I.E.

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): 

속성을 참조하기 위해 문자열을 사용해야하는 것처럼 보이지 않지만이 작업을 수행하는 다른 방법이 없습니다. 거기 있니?

답변

2

"때로는 프로그래밍의 마법의 만병 통치약 (magic panacea)으로 제안 된 또 하나의 단계"(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에서 "후크 기능"입니다. 아니면, 적어도 그것을 보는 하나의 방법이고, 다른 하나는 내가 시작한 "간접적 인 수준"입니다 .-).