2009-08-09 5 views

Antwort

5

Alles, was eine Aussage wie:

v1 = 0 

tun können 0 den Namen v1 an das Objekt binden wird. Es kann sich nicht auf ein anderes Modul auswirken.

Wenn ich dort unbekannte Begriffe verwende, und ich denke, ich bin wahrscheinlich, empfehle ich Ihnen, Fredrik Lundhs exzellenten Artikel Python Objects: Reset your brain zu lesen.

1

Ja, man muss nur darauf zugreifen richtig (und nicht import * verwenden, es ist böse)

c.py:

import a 
print a.v1 # prints 1 
a.v1 = 0 
print a.v1 # prints 0 
2

Die from ... import * Form grundsätzlich für handlichen interaktiven Gebrauch bestimmt bei der Eingabeaufforderung des Interpreters: Sie würden gut daran tun, es nie in anderen Situationen zu benutzen, da es Ihnen nur Probleme gibt.

In der Tat geht der hauseigene Styleguide bei meinem Arbeitgeber weiter und empfiehlt, immer ein Modul zu importieren, nie Inhalt von innerhalb eines Moduls (ein Modul aus einem Paket ist OK und in der Tat empfohlen). Als Ergebnis sind in unserer Codebasis Verweise auf importierte Dinge immer qualifizierte Namen (themod.thething) und niemals Barnamen (die sich immer auf eingebaute, globale Variablen desselben Moduls oder Einheimische beziehen); Dies macht den Code viel klarer und lesbarer und vermeidet alle Arten von subtilen Anomalien.

Natürlich, wenn der Name eines Moduls zu lang ist, ist eine as Klausel im Import, um es einen kürzeren und handlicheren Alias ​​für die Zwecke des Importmoduls zu geben, in Ordnung. Aber mit Ihren Ein-Buchstaben-Modulnamen wird das nicht benötigt ;-).

Also, wenn Sie die Leitlinie folgen und importieren immer das Modul (und nicht die Dinge aus seinem Inneren), wird c.v1 immer auf dasselbe beziehen, während a.v1 und b.v1, die beide für das Abrufen und Einstellung: hier ist eine mögliche subtile Anomalie rechts von der Fledermaus vermieden -)

den allerletzten Bit des Zen of Python Denken sie daran, (do import this im Interpreter Prompt alles) zu sehen:

Namespaces are one honking great idea -- let's do more of those! 

Import des gesamten Moduls (nicht Bits und Stücke von innen) bewahrt seine Integrität als amenspace, wie es sich immer auf Dinge innerhalb des importierten Moduls durch qualifizierte (gepunktete) Namen bezieht. Es ist eine großartige Idee Hupen: mehr tun, dass -)

+0

Also Sie nie "von Datetime Datetime importieren"; du importierst immer datetime und gibst jedesmal "datetime.datetime" ein?Das ist ein schrecklicher Style Guide. –

+0

@Glenn, auf Ihre Frage, "ja"; Ihrer Meinung nach kenne ich keinen Python Style Guide, der von mehr Python Committern (einschließlich Guido ;-), AND akzeptiert und durch "Lesbarkeitsüberprüfungen" erzwungen wird) UND unsere Python SW scheint einigermaßen erfolgreich zu sein (einschließlich Zeit für Markt, Wartbarkeit, Leistung [cfr YouTube, Python-basierte und schnell], etc.), so frage ich mich, auf welche empirischen Daten basieren Sie diese Meinung. Yep, PEP 8 akzeptiert "Importieren einer Klasse", aber Guido schrieb das _before_ er trat Google bei und traf (und akzeptierte und durchsetzte) unseren tollen Style Guide! -) –

+1

"datetime.datetime" zu schreiben ist schrecklich hässlich; "datetime.datetime.now" ist noch hässlicher; Codierungsstile, die hässlichen Code fördern, sind schlecht. Allgemeiner ist es wenig hilfreich, das Modul als Namespace zu haben, wenn die Klasse selbst ein Namespace ist. Importieren Sie die Ebene, die als Namespace gedacht ist - für viele Module ist dies das Modul selbst, aber für Klassen wie datetime ist es die Klasse. –

Verwandte Themen