/ / python import behavior: rôzne objekty z rovnakého súboru? - python, objekt, import, modul

python import behavior: rôzne objekty z rovnakého súboru? - python, objekt, import, modul

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ď č. 1

Moduly 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ší.