Beste Praxis bei der Definition von Instanz-Variablen
Ich bin ziemlich neu in Python und habe eine Frage bezüglich der folgenden Klasse:
class Configuration:
def __init__(self):
parser = SafeConfigParser()
try:
if parser.read(CONFIG_FILE) is None:
raise IOError('Cannot open configuration file')
except IOError, error:
sys.exit(error)
else:
self.__parser = parser
self.fileName = CONFIG_FILE
def get_section(self):
p = self.__parser
result = []
for s in p.sections():
result.append('{0}'.format(s))
return result
def get_info(self, config_section):
p = self.__parser
self.section = config_section
self.url = p.get(config_section, 'url')
self.imgexpr = p.get(config_section, 'imgexpr')
self.imgattr1 = p.get(config_section, 'imgattr1')
self.imgattr2 = p.get(config_section, 'imgattr2')
self.destination = p.get(config_section, 'destination')
self.createzip = p.get(config_section, 'createzip')
self.pagesnumber = p.get(config_section, 'pagesnumber')
Ist es OK, um hinzuzufügen mehrere Instanz-Variablen in einer anderen Funktion, get_info
in diesem Beispiel, oder ist es am besten Praxis zu definieren, der alle Instanzvariablen im Konstruktor? Konnte nicht es führen zu spaghetti-code, wenn ich definieren neue Instanz-Variablen, die alle über dem Platz?
EDIT: ich verwende diesen code mit einem einfachen Bild-Spachtel. Über get_section
ich wieder alle Abschnitte in der config-Datei, und klicken Sie dann Durchlaufen Sie, besuchen Sie jede Website, die ich bin Schaben Bilder aus. Für jede iteration ich einen Anruf an get_section
Sie die Konfigurations-Einstellungen für jeden Abschnitt in der config-Datei.
Wenn jemand kann kommen mit einem anderen Ansatz, es werde in Ordnung sein! Danke!
Die
self.__parser = None
sollte festgelegt werden, am Anfang des __init__()
. Der Grund dafür ist, dass die __init__()
wird als erste mentod von bereits vorhandenen - Objekt. Wenn der parser fehlschlägt, Lesen Sie die config-Datei und löst die Ausnahme aus, kann die Ausnahme durch aufgefangene anderswo (das Programm kann nicht beendet werden). Dann das Objekt der Configuration
Klasse noch vorhanden ist und die später get_info()
verursachen *AttributeError: Konfiguration Beispiel hat kein Attribut '__ - parser'.Sollte ich gelesen haben, beantworten Sie die Art und Weise, dass ich sollte hinzufügen
self.__parser = None
Anfang __init__.py
oder schlagen Sie vor, sich zu bewegen der parser Initialisierung von __init__.py
zu einer anderen Funktion?Nein, die
self.__parser
geschaffen werden sollte, an den Anfang der Methode __init__
von der Klasse Configuration
. Die __init__.py
ist völlig unabhängig von dem problem.InformationsquelleAutor happygoat | 2012-05-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde auf jeden Fall erklären, alle Instanz-Variablen in
__init__
. Es nicht zu tun, führt zu einer erhöhten Komplexität und möglichen unerwarteten Nebenwirkungen.Um eine Alternative Sicht von Davids Hall in Bezug auf Zugang, dieser ist von der Google Python style guide.
Von PEP8
Python ist nicht java/C#, und es hat sehr starke Ideen über, wie könnte der Aussehen sollte und geschrieben werden. Wenn Sie coding python es macht Sinn, um es so Aussehen und fühlen wie python. Andere Menschen werden in der Lage sein zu verstehen, Ihren code leichter und Sie werden in der Lage sein, zu verstehen, andere python-code auch besser.
Es war ein wirklich Interessantes Gespräch im letzten Jahr pycon "Stop writing classes", hier ist der hacker news-thread, der hat einige gute Diskussion. Sowohl der thread und das video sind es Wert, gelesen zu werden. news.ycombinator.com/item?id=3717715
Prost - ich werde einen Blick zu haben. Wie Sie wahrscheinlich sagen, ich bin ein c++/c# - Entwickler, der weiß, einige python so Diskussionen wie diese sind toll zu Lesen.
Lesen, dass der thread erinnert mich an etwas, das mein Sinn gekommen beim schreiben der ursprünglichen Antwort, die wurden entfernt während der Bearbeitung - während ich persönlich wie Klassen und so durch meine Geschichte ALLE die Zeit, die ich geschrieben habe eine Klasse namens " Konfiguration in einem python-Projekt habe ich umgestaltet werden, es entfernt innerhalb von zwei Tagen.
Ich weiß wie du dich fühlst, arbeite ich hauptsächlich in C# aus einem embedded-C-hintergrund. Für alle meine freiberufliche/Spaß-Projekte, die ich verschoben haben, um python-jetzt aber, und es dauerte eine Weile, um zu starten versucht, zu denken pythonically.
InformationsquelleAutor Andrew Barrett
Ich würde zugunsten Einstellung alle Instanzvariablen im Konstruktor über die Funktionen wie
get_info()
, die erforderlich sind, um die Klasse in einen gültigen Zustand.Mit öffentlichen Instanzvariablen, das sind nur instanziiert, indem Sie Methoden aufrufen, wie Sie Ihre
get_info()
erstellen Sie eine Klasse, ist ein bisschen wie ein Minenfeld zu verwenden.Wenn Sie sind besorgt über bestimmte Konfigurationswerte, die nicht immer benötigt und sind teuer zu berechnen (ich glaube, das ist, warum Sie get_info(), so dass für die verzögerte Ausführung), dann würde ich mir entweder überlegen, refactoring, die Teilmenge der config in eine zweite Klasse oder Vorstellung Eigenschaften oder Funktionen, die Werte zurückgeben.
Eigenschaften oder Holen Sie sich Stil-Funktionen, die Sie ermutigen Verbraucher der Klasse, gehen über eine definierte Schnittstelle und Verbesserung der Kapselung 1.
Sobald Sie haben, dass die Kapselung der Instanz-Variablen geben Sie sich selbst die option, etwas zu tun mehr als einfach werfen ein
NameError
Ausnahme - können Sie vielleicht sagenget_info()
selbst, oder werfen Sie eine eigene exception.1.können Sie nicht bieten 100% Kapselung mit Python, da private Instanz-Variablen gekennzeichnet durch einen doppelten führenden Unterstriche sind nur private durch Konvention
Guter Punkt - mein Hauptproblem mit öffentlichen Instanzvariablen hier ist instanziieren Sie in Funktionen wie get_info macht unnötig schwer zu bedienen Klassen. Aber Sie und Andrew Barret haben mich dazu bewegt, mein edit beantworten, eine Berührung, die Betonung von Konstruktoren.
InformationsquelleAutor David Hall