2010-06-11 11 views
10

Ich lerne Python und habe mit Paketen herumgespielt. Ich wollte wissen, wie man Klassen in Paketen am besten definiert. Es scheint, dass die einzige Möglichkeit, Klassen in einem Paket zu definieren, darin besteht, sie in der __init__.py dieses Pakets zu definieren. Aus Java kommend würde ich gerne einzelne Dateien für meine Klassen definieren. Ist das eine empfohlene Praxis?Klassen in Paketen definieren

Ich mag würde mein Verzeichnis haben schauen etwas wie folgt aus:

recursor/ 
    __init__.py 
    RecursionException.py 
    RecursionResult.py 
    Recursor.py 

So konnte ich meinen Klassen als recursor.Recursor beziehen, recursor.RecursionException und recursor.RecursionResult. Ist das in Python machbar oder empfehlenswert?

+4

Obligatorisch: [Python ist nicht Java] (http://dirtsimple.org/2004/12/python-is-not-java.html) – voyager

+0

Siehe auch http://StackOverflow.com/Questions/2339371/ as-a-java-programmierer-lernen-python-was-sollte-ich-ausschauen-für – froadie

+2

Ja können Sie, aber nein sollten Sie nicht. –

Antwort

8

Gehen Sie voran und definieren Sie Ihre Klassen in separaten Modulen. Dann machen __init__.py so etwas tun:

from RecursionException import RecursionException 
from RecursionResult import RecursionResult 
from Recursor import Recursor 

, dass jede Klasse importieren wird in das Root-Namespace des Pakets, so ruft Code recursor.Recursor beziehen statt recursor.Recursor.Recursor.

Ich empfinde die Notwendigkeit, einige der anderen Kommentare hier zu wiederholen: Python ist nicht Java. Anstatt ein neues Modul für jede Klasse unter der Sonne zu erstellen, empfehle ich, eng verwandte Klassen in einem einzigen Modul zu gruppieren. Es ist einfacher, Ihren Code auf diese Weise zu verstehen, und der Aufruf von Code erfordert keine bazillion Importe.

+4

Obwohl 'recursor.Recursor.Recursor' hat einen gewissen Charme zu ihm. – Ricky

2

Dies ist perfekt machbar. Erstellen Sie einfach ein neues Klassenmodul für jede dieser Klassen und erstellen Sie genau die Struktur, die Sie gepostet haben.

Sie können auch ein Recursion.py-Modul oder ähnliches erstellen und alle 3 Klassen in diese Datei einschließen.

(Ich bin auch neu in Python von Java, und ich habe noch nicht in meinen __init__.py Dateien setze alles ...)

+0

Wenn ich das obige Verzeichnislayout erstelle, meine Recursor-Klasse in der Recursor.py-Datei definiere und versuche, "recursor.Recursor" zu importieren, bekomme ich einen ImportError. Was mache ich falsch? –

+0

@rfkrocktk - Sie müssen möglicherweise recursor.Recursor.Recursor angeben ... die erste für das Paket, die zweite für das Modul (die Datei), und die dritte für die tatsächliche Klasse ... (Es ist manchmal besser zu prüfen, zu verwenden Module sort of as packages ... anstelle eines Paketrecursor mit diesen 3 Klassen als separate Dateien, können Sie einen Modulrecursor mit diesen 3 Klassen innerhalb haben) – froadie

1

In Python sind Sie nicht auf der Definition 1 Klasse pro Datei beschränkt und nur wenig TU das. Sie können, wenn Sie wollen, aber - es liegt ganz bei Ihnen. Ein Paket in Python ist nur ein Verzeichnis mit einer Datei

__init__.py 

Datei. Sie müssen nichts in diese Datei setzen, um zu steuern, was importiert wird usw.

Verwandte Themen