2011-01-30 2 views
0

я заметил, что я часто пишу следующее:питон: __init__ шаблон

class X: 
    def __init__(self, var1, var2, var3): 
    self.var1 = var1 
    self.var2 = var2 
    self.var3 = var3 
    # more code here 

Это хорошая идея, чтобы сделать шаблон, который я могу повторно использовать вместо того, чтобы делать это каждый раз? Если да, то как мне это сделать?

+0

Что вам нужен шаблон? Неужели это так обременительно, чтобы напечатать его? – Falmarri

+0

Не обременительно, но я ненавижу повторяющийся код. Больше шансов на опечатку, отвлекает от видения важных вещей и т. Д. – max

+2

Я согласен, что это раздражающе повторяется, но я бы посоветовал это: используя волшебный помощник, чтобы сделать это, вы сделаете код намного менее понятным для других людей ; вышесказанное может быть понято мгновенно. Это также означает, что вам нужно переписать код, если позднее добавить параметр, который * не * хранится в объекте. –

ответ

1

я не предложил бы использовать такие шаблоны в производственном коде, поскольку

Explicit is better than implicit. 

Для прототипов выброса это может быть приемлемо. Вот пример из питона рецептов:

Он определяет декоратора с может быть присоединен к __init__:

def injectArguments(inFunction): 
    """ 
    This function allows to reduce code for initialization 
    of parameters of a method through the @-notation 
    You need to call this function before the method in this way: 
    @injectArguments 
    """ 
    def outFunction(*args, **kwargs): 
     _self = args[0] 
     _self.__dict__.update(kwargs) 
     # Get all of argument's names of the inFunction 
     _total_names = \ 
      inFunction.func_code.co_varnames[1:inFunction.func_code.co_argcount] 
     # Get all of the values 
     _values = args[1:] 
     # Get only the names that don't belong to kwargs 
     _names = [n for n in _total_names if not kwargs.has_key(n)] 

     # Match names with values and update __dict__ 
     d={} 
     for n, v in zip(_names,_values): 
      d[n] = v 
     _self.__dict__.update(d) 
     inFunction(*args,**kwargs) 

    return outFunction 

тест-:

class Test: 
    @injectArguments 
    def __init__(self, name, surname): 
     pass 

if __name__=='__main__': 
    t = Test('mickey', surname='mouse') 
    print t.name, t.surname 
+2

Это заставляет меня смутно нервничать; это слишком много магии для слишком маленького выигрыша. –

+1

(_I _can _also _only _wonder _why _it _written _like _this ...) –

0

Возможно, вы можете написать обертку, которая анализирует имена и создает атрибуты для self. Но действительно ли это нужно? Я имею в виду, что будет больше кода, чем это. Если у вас слишком много параметров конструктора, возможно, рефакторинг для чего-то более разумного - это лучший вариант?

В противном случае - если вы ожидаете, кто-то еще работать над проектом, то либо имя декоратор @magic_you_should_really_read_about, или просто написать стандартный код;) Из «импорта этой»: Explicit is better than implicit.

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