python: __init__ template - PullRequest
       6

python: __init__ template

0 голосов
/ 31 января 2011

Я заметил, что часто пишу следующее:

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

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

Ответы [ 2 ]

1 голос
/ 31 января 2011

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

Explicit is better than implicit.

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

Он определяет декоратор, который может быть присоединен к __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
0 голосов
/ 31 января 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...