2010-07-31 8 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

«Еще один уровень косвенности» (иногда предлагается как волшебная панацея программирования ;-) - как и для типичных декораторов, таких как 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. Или, по крайней мере, это один из способов взглянуть на него, а другой - на «дополнительный уровень косвенности», с которым я начал :-).

Смежные вопросы