Избегайте избыточности в Python - PullRequest
6 голосов
/ 27 января 2011

Я недавно начал использовать Python 2.6 для администратора Ubuntu Server и у меня есть две незначительные проблемы, связанные с избыточностью:

Во-первых, это импорт: все они выглядят как

Класс импорта из класса

from class import Class

И второе - __init__ методы:

__init__(self,arg1,...,argn):
    self.arg1 = arg1
    ...
    self.argn = argn

Есть ли способы избежать этого дублирования?

Ответы [ 3 ]

7 голосов
/ 27 января 2011

Второе - это не избыточность - это установка атрибутов экземпляра.Вы также можете сделать это так:

class Foo:

   def __init__(self, **kwargs):
       for name, value in kwargs.items():
          setattr(self, name, value)

Но тогда вам нужно вызвать Foo следующим образом:

   Foo(arg1=1, arg2=2, arg3=3)

Также ваш импорт имеет неправильный синтаксис.Это должно быть from Class import Class.Это выглядит избыточным для вас, потому что кажется, что вы храните каждый класс в отдельном файле (модуле) - и это точно избыточно.Python - это не Java, обычно вы должны хранить больше объектов в одном модуле.Имейте в виду, что сам модуль является объектом.Также вы должны правильно называть модули - в руководстве по стилю кода по умолчанию сказано, что все модули должны быть строчными, без специальных символов.Например, re или urllib.

2 голосов
/ 27 января 2011
from module import Class

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

def __init__(self, a, b, c):
  self.a = a
  self.b = b
  self.c = c

Это часто кажется немного раздражающим, но на самом деле это неплохо с точки зрения читаемости по сравнению с альтернативами. Однако, если у вас есть много параметров, которые вы просто назначаете в качестве атрибутов без какой-либо другой работы в вашей инициализации, тогда рассмотрите возможность наследования от именованного кортежа или аналогичного, который может создать такой шаблон для вас. (Namedtuple, в частности, имеет другие разветвления и подходит только иногда. Я использую его в качестве примера базового класса, который может обрабатывать этот тип шаблонов.)

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

Версия для аргументов:

class Foo:

   def __init__(self, *args):
       for index,arg in enumerate(args):
          setattr(self, 'arg%s'%index, arg)


Foo(1,2,3)
>>> Foo.arg0
1
...