Module und Pakete in Python sind "Namespaces"

Motivation zum Schreiben dieses Artikels

Wenn es so etwas wie "Schreiben Sie es richtig in diesen Artikel oder dieses Dokument" gibt, wäre ich Ihnen dankbar, wenn Sie es mich wissen lassen könnten.

Nachteile der Trennung von Dateien nach Klassen

In Sprachen wie Java und C #, die durch die Objektorientierung eingeschränkt sind, ist es meiner Meinung nach üblich, eine öffentliche Klasse pro Datei zu schreiben.

Aber in Python sind "~ .py" alle Module, und Module sind eine Reihe von Funktionen, die sie bereitstellen. Ich denke, das Modul kann mehrere Klassen haben.

In Djangos models.py (dem Standardmodul, das die ORM-Entitätsklasse implementiert) wird beispielsweise ein Bild zum Schreiben aller Entitätsklassen in einer Zeile angezeigt.

models.py


from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

Auszug aus "Erstellen Ihrer ersten Django-App, Teil 2"

In der Praxis mag es selten vorkommen, dass diese Anzahl von Zeilen passt, aber ist es so vorteilhaft, eine Klasse von höchstens ein paar Zeilen in eine separate Datei zu trennen? Wenn sich die Sprache ändert, ändert sich natürlich auch der gesunde Menschenverstand. Ich denke, dass es in Python anders ist, eine Klasse und eine Datei wie angegeben zu behandeln.

Der größte Grund, warum ich das so finde, ist, dass es sich auf das Schreiben von "Import" auswirkt.

Modulimport bei 1 Klasse 1 Datei

Zum Beispiel, wenn die Konfiguration wie folgt ist

polls/models/
 ├─ __init__.py
 ├─ question.py ...Es ist nur die Frage definiert
 └─ choice.py   ...Es ist nur die Auswahl definiert

Um jede Klasse aufzurufen, schreiben Sie:

from polls.models.question import Question
from polls.models.choice import Choice
question = Question()
choice = Choice()

Alternativ können Sie schreiben:

from polls import models
question = models.question.Question()
choice = models.choice.Choice()

Sie haben für jede Klasse einen eigenen Namespace erstellt, oder? Ich fühle mich übertrieben.

Wenn sich alle Klassen in einem Modul befinden

Es hat die gleiche Struktur wie das Tutorial.

polls/models.py

Um die Klasse aufzurufen, schreiben Sie:

from polls.models import Question, Choice
question = Question()
choice = Choice()

Oder Sie können alles mit * importieren.

from polls.models import *
question = Question()
choice = Choice()
#Es ist nicht explizit, wo und was Sie importiert haben, daher ist es eine andere Frage, ob Sie es verwenden oder nicht.

Ich denke, es ist eine einfache Struktur, in der Question``Choice im Namespace polls.models lebt.

Gründe für die Verwendung von Paketen

Warum gibt es eine Funktion namens Paket? Zum Beispiel sind die folgenden Gründe möglich

In diesem Fall ist die Sichtbarkeit schlechter, wenn Sie das Paket nicht verwenden, und Sie können die Dinge nicht organisieren. Verwenden wir Pakete, um Module zu trennen. Ich denke, es ist notwendig, jedes Mal darüber nachzudenken, wie ein Modul in ein Paket geschnitten werden kann, je nachdem, wofür das Paket gedacht ist.

Das einzig Wichtige ist, dass ** der Importeur darauf zugreifen kann, als wäre es ein einzelnes Modul **.

__Init __. Py dafür

Angenommen, basierend auf dem Beispiel im vorherigen Lernprogramm (das möglicherweise nicht sehr häufig vorkommt), ist jede Klasse aufgebläht und es wurden Hilfsfunktionen angezeigt, die nur von Modellen verwendet werden. Daher werden die Dateien in Pakete unterteilt.

polls/models/
 ├─ __init__.py
 ├─ question.py ...Frage ist definiert
 ├─ choice.py   ...Auswahl ist definiert
 └─ helper.py   ...Komfortfunktion ist definiert

Wenn Sie bei dieser Rate "Frage" aufrufen möchten, müssen Sie "aus polls.models.question import Question" schreiben. Mit anderen Worten, die Art und Weise, wie der Import geschrieben wird, ändert sich im Vergleich zu einer Datei. Wenn dies eine Bibliothek wäre, wäre dies eine katastrophale Änderung, die sich auf die Schnittstelle auswirkt.

Fügen Sie daher dem immer leeren "__init __. Py" Folgendes hinzu. Es ist zweckmäßig, das Zielmodul aus "." Zu schreiben, da es zu einer relativen Referenz wird.

polls/models/__init__.py


from .question import Question
from .choice import Choice
# (Ich schreibe keinen Helfer, weil er nur intern verwendet wird)

Wenn Sie dies schreiben, können Sie klar angeben, dass " Question Choice im Namespace" polls.models`! "Ist, und Sie können den Import so schreiben, wie er ist.

from polls.models import Question, Choice
question = Question()
choice = Choice()

Das heißt, ** Module und Pakete sind Namespaces **

――Ich möchte, dass die Granularität des Namespace angemessen ist, und es ist etwas seltsam, einen Namespace nur für eine Klasse zu definieren.

Natürlich sind einige Bibliotheken so konzipiert, dass sie direkt auf die Module im Paket verweisen. Wahrscheinlich eine riesige Bibliothek wie ein Framework. Trotzdem sind die Endpakete für den Benutzer organisiert. Es kann hilfreich sein, solchen Code zu lesen.

Recommended Posts

Module und Pakete in Python sind "Namespaces"
Python-Pakete und -Module
Organisieren Sie Python-Module und -Pakete in einem Chaos
Lernen Sie Python-Pakete und -Module kennen
Pakete, die MIDI mit Python Midi und Pretty_Midi verarbeiten
Python-Grundkurs (14 Module und Pakete)
Nest Zahnrad in discord.py
Module und Pakete in Python sind "Namespaces"
Zusammenfassung der Module und Klassen in Python-TensorFlow2-
Schreiben Sie mit f2py ein Python-Modul in fortran
Stapel und Warteschlange in Python
Unittest und CI in Python
Erhalten Sie ein abstraktes Verständnis der Python-Module und -Pakete
Listet Methodenargumentinformationen für Klassen und Module in Python auf
Eine Standardmethode zum Entwickeln und Verteilen von Paketen in Python
Einführung in die Effektüberprüfung Schreiben der Kapitel 4 und 5 in Python
Unterschied zwischen list () und [] in Python
Unterschied zwischen == und ist in Python
Zeigen Sie Fotos in Python und HTML an
Sortieralgorithmus und Implementierung in Python
Bearbeiten Sie Dateien und Ordner in Python
Über Python und Cython dtype
Informationen zu Python Primer-Modulen und bedingten Ausdrücken
Zuweisungen und Änderungen in Python-Objekten
[Python] Was sind @classmethod und Dekorateure?
Überprüfen und verschieben Sie das Verzeichnis in Python
Verschlüsselung mit Python: IND-CCA2 und RSA-OAEP
Hashing von Daten in R und Python
Funktionssynthese und Anwendung in Python
Exportieren und Ausgeben von Dateien in Python
Reverse Flat Pseudonym und Katakana in Python2.7
Lesen und Schreiben von Text in Python
[GUI in Python] PyQt5-Menü und Symbolleiste-
Erstellen und lesen Sie Messagepacks in Python
Reguläre Ausdrücke, die in Python leicht und solide zu erlernen sind
Laden Sie Pakete, die sich nicht in Conda befinden, auf anaconda.org hoch und verwalten Sie sie
Überlappende reguläre Ausdrücke in Python und Java
Unterschied in der Authentizität zwischen Python und JavaScript
Hinweise zur Verwendung von cChardet und python3-chardet in Python 3.3.1.
Vermeiden Sie verschachtelte Schleifen in PHP und Python
Unterschiede zwischen Ruby und Python im Umfang
AM-Modulation und Demodulation mit Python Part 2
Unterschied zwischen Anweisungen (Anweisungen) und Ausdrücken (Ausdrücken) in Python
Echte Werte und Eigenvektoren: Lineare Algebra in Python <7>
Virtuelle Python-Umgebung und Pakete unter Ubuntu
Warteschlangen- und Python-Implementierungsmodul "deque"
Gefaltetes Liniendiagramm und Skalierungslinie in Python
[Python] Packen und verteilen Sie Ihre eigenen Module
Implementieren Sie den FIR-Filter in Python und C.
Unterschiede zwischen Python- und Java-Syntax
Überprüfen und empfangen Sie die serielle Schnittstelle in Python (Portprüfung)
Suchen und spielen Sie YouTube-Videos mit Python
Unterschied zwischen @classmethod und @staticmethod in Python
Unterschied zwischen Anhängen und + = in der Python-Liste
Unterschied zwischen nicht lokal und global in Python
Schreiben Sie die O_SYNC-Datei in C und Python
Umgang mit "Jahren und Monaten" in Python
Lesen und schreiben Sie JSON-Dateien mit Python
Zeichnen Sie Daten einfach in Shell und Python
Private Methoden und Felder in Python [Verschlüsselung]
Suchen und überprüfen Sie die inverse Matrix in Python
Lineare Unabhängigkeit und Basis: Lineare Algebra in Python <6>
Rufen Sie sudo in Python auf und füllen Sie das Passwort automatisch aus
Zusammenfassung der Module und Klassen in Python-TensorFlow2-