6 Stimmen

Redundanz in Python vermeiden

Ich habe vor kurzem begonnen, Python 2.6 für Ubuntu Server Admin zu verwenden und habe zwei kleinere Probleme bezüglich der Redundanz:

An erster Stelle stehen die Einfuhren: Sie sehen alle in etwa so aus

import Klasse von Klasse

from class import Class

Und die zweite Sache sind __init__ Methoden:

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

Gibt es Möglichkeiten, diese Überschneidungen zu vermeiden?

8voto

gruszczy Punkte 39020

Die zweite Sache ist keine Redundanz - es ist das Setzen von Instanzattributen. Sie können es auch so machen:

class Foo:

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

Aber dann müssen Sie Foo so nennen:

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

Auch Ihr Import scheint eine fehlerhafte Syntax zu haben. Es sollte sein from Class import Class . Das sieht für Sie redundant aus, denn es scheint, dass Sie jede Klasse in einer eigenen Datei (Modul) speichern - und genau das ist redundant. Python ist nicht Java, Sie sollten normalerweise mehrere Objekte in einem Modul speichern. Denken Sie daran, dass das Modul selbst ein Objekt ist. Außerdem sollten Sie Module richtig benennen - der Standard-Code-Style-Guide besagt, dass Module nur in Kleinbuchstaben und ohne Sonderzeichen geschrieben werden sollten. Zum Beispiel re o urllib zum Beispiel.

2voto

Fred Nurk Punkte 13458
from module import Class

Es ist üblich, dass Klassennamen sich von den Namen der enthaltenen Module unterscheiden. Wenn Sie nur eine Klasse pro Modul mit einem identischen Namen haben, sollten Sie erwägen, diese Klasse eine Ebene höher in Ihrer Hierarchie zu platzieren.

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

Das ist zwar oft etwas lästig, aber im Vergleich zu den Alternativen ist es wirklich nicht schlecht, was die Lesbarkeit angeht. Wenn Sie jedoch viele Parameter haben, die Sie lediglich als Attribute zuweisen, ohne dass in Ihrem Init weitere Arbeit anfällt, dann sollten Sie die Vererbung von einem Namedtuple oder ähnlichem in Betracht ziehen, das solche Boilerplate für Sie generieren kann. (Namedtuple im Besonderen hat andere Verzweigungen und wird nur manchmal geeignet sein. Ich verwende es als Beispiel für eine Basisklasse, die mit dieser Art von Boilerplate umgehen kann).

1voto

Frost.baka Punkte 7453

Version für args:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X