zváž toto:
/
test.py
lib/
L __init__.py
+ x/
L __init__.py
L p.py
s p.py:
class P():
pass
p1 = P()
S test.py:
import sys
import os
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib"))
import lib.x.p
import x.p
print(id(lib.x.p.p1))
print(id(x.p.p1))
Tu dostávam rôzne identifikátory objektov, hoci somimportovanie toho istého objektu z toho istého balíka / modulu Môže niekto vysvetliť toto správanie, pretože je veľmi mätúce a ja som nenašiel žiadnu dokumentáciu o tom.
Vďaka!
odpovede:
2 pre odpoveď č. 1Moduly sa ukladajú vo vyrovnávacej pamäti sys.modules
pomocou ich bodkovaných mien ako kľúče. Keď importujete ten istý modul do dvoch rôznych bodkovaných názvov, skončíte s dvoma kópiami tohto modulu a tiež s dvoma kópiami všetkého vo vnútri.
Riešenie je jednoduché: nerobte to a pokúste sa vyhnúť tomu, aby ste sa prehýbali sys.path
.
0 pre odpoveď č. 2
x.p
a lib.x.p
nie sú rovnakým modulom. Pochádzajú z toho istého súboru, ale Python neurčuje identitu modulu v jeho súbore; totožnosť modulu je založená na jeho kvalifikovanom názve balíka.Loginológia vyhľadávania modulov môže nájsť rovnaký súbor pre oba moduly, ale sú stále načítané a vykonávané samostatne a objekty vytvorené v jednom module sa odlišujú od objektov vytvorených v ďalší.