Ik heb een map waarin alle .py-bestanden zijn opgeslagen.
bin/
main.py
user.py # where class User resides
dir.py # where class Dir resides
Ik wil klassen van user.pyen dir.pygebruiken in main.py.
Hoe kan ik deze Python-klassen importeren in main.py?
Bovendien, hoe kan ik klasse User
importeren als user.pyzich in een submap bevindt?
bin/
dir.py
main.py
usr/
user.py
Antwoord 1, autoriteit 100%
Python 2
Maak een leeg bestand met de naam __init__.py
in dezelfde map als de bestanden. Dat betekent voor Python dat het “oké is om uit deze map te importeren”.
Doe dan gewoon…
from user import User
from dir import Dir
Hetzelfde geldt als de bestanden zich in een submap bevinden – plaats ook een __init__.py
in de submap en gebruik dan gewone importinstructies, met puntnotatie. Voor elk mapniveau moet u iets toevoegen aan het importpad.
bin/
main.py
classes/
user.py
dir.py
Dus als de map “classes” heette, dan zou je dit doen:
from classes.user import User
from classes.dir import Dir
Python 3
Hetzelfde als de vorige, maar voeg een .
als er geen submap wordt gebruikt:
from .user import User
from .dir import Dir
Antwoord 2, autoriteit 14%
Ik heb net geleerd (dankzij martineau’s commentaar) dat u, om klassen uit bestanden in dezelfde map te importeren, nu in Python 3 zou schrijven:
from .user import User
from .dir import Dir
Antwoord 3, autoriteit 4%
In uw main.py
:
from user import Class
waarbij Class
de naam is van de klas die u wilt importeren.
Als je een methode van Class
wilt aanroepen, kun je deze aanroepen met:
Class.method
Houd er rekening mee dat er een leeg bestand __init__.py
in dezelfde map moet staan.
Antwoord 4, autoriteit 3%
In python3 is __init__.py
niet meer nodig. Als de huidige map van de console de map is waar het python-script zich bevindt, werkt alles goed met
import user
Dit werkt echter niet als het wordt aangeroepen vanuit een andere directory, die geen user.py
bevat.
Gebruik in dat geval
from . import user
Dit werkt zelfs als je het hele bestand wilt importeren in plaats van alleen een klas vanaf daar.
Antwoord 5
Je kunt de module importeren en toegang krijgen via de naam als je geen functies en klassen met de jouwe wilt mixen
import util # imports util.py
util.clean()
util.setup(4)
of u kunt de functies en klassen in uw code importeren
from util import clean, setup
clean()
setup(4)
je kunt wildchar * gebruiken om alles in die module naar je code te importeren
from util import *
clean()
setup(4)
Antwoord 6
Als user.py en dir.py geen klassen bevatten, dan
from .user import User
from .dir import Dir
werkt niet. U moet dan importeren als
from . import user
from . import dir
Antwoord 7
Om het begrijpelijker te maken:
Stap 1: laten we naar één map gaan, waar alles wordt opgenomen
$ cd /var/tmp
Stap 2: laten we nu een class1.py-bestand maken met de klassenaam Class1 met wat code
$ cat > class1.py <<\EOF
class Class1:
OKBLUE = '\033[94m'
ENDC = '\033[0m'
OK = OKBLUE + "[Class1 OK]: " + ENDC
EOF
Stap 3: laten we nu een class2.py-bestand maken met de klassenaam Class2 met wat code
$ cat > class2.py <<\EOF
class Class2:
OKBLUE = '\033[94m'
ENDC = '\033[0m'
OK = OKBLUE + "[Class2 OK]: " + ENDC
EOF
Stap 4: laten we nu één main.py maken die één keer wordt uitgevoerd om Class1 en Class2 uit 2 verschillende bestanden te gebruiken
$ cat > main.py <<\EOF
"""this is how we are actually calling class1.py and from that file loading Class1"""
from class1 import Class1
"""this is how we are actually calling class2.py and from that file loading Class2"""
from class2 import Class2
print Class1.OK
print Class2.OK
EOF
Stap 5: voer het programma uit
$ python main.py
De uitvoer zou zijn
[Class1 OK]:
[Class2 OK]:
Antwoord 8
Python 3
Dezelfde directory
.
importbestand:log.py
importklasse: SampleApp()
.
import log
if __name__ == "__main__":
app = log.SampleApp()
app.mainloop()
of
directory is basic
.
importeren in bestand: log.py
.
importklasse: SampleApp()
.
from basic import log
if __name__ == "__main__":
app = log.SampleApp()
app.mainloop()
Antwoord 9
from user import User
from dir import Dir
Antwoord 10
Ik weet niet zeker waarom dit werkt, maar ik gebruik Pycharm build from file_in_same_dir import class_name
De IDE heeft erover geklaagd, maar het lijkt erop dat het nog steeds werkt. Ik gebruik Python 3.7
Antwoord 11
Voor python3
importeren van broer of zus: from .user import User
importeer van neef: from .usr.user import User
Antwoord 12
Als je filename.py
in dezelfde map hebt staan, kun je het gemakkelijk als volgt importeren:
import filename
Ik gebruik python3.7
Antwoord 13
# My Python version: 3.7
# IDE: Pycharm 2021.1.2 Community
# Have "myLib" in folder "labs":
class Points:
def __init__(self, x = 0, y = 0):
self.__x = x
self.__y = y
def __str__(self):
return f"x = {self.__x}, y = {self.__y}"
# Have "myFile" in (same) folder "labs":
from myFile import Point
p1 = Point(1, 4)
p2 = Point(1, 4)
print(f"p1: {p1}, p2: {p2}")
# Result:
# p1: x = 1, y = 4, p2: x = 1, y = 4
# Good Luck!
Antwoord 14
Voor Python 3+, stel dat je deze structuur hebt:
A/
__init__.py
bar.py
foo.py
In uw __init__.py
-bestand kunt u from . import foo
dan kun je foo importeren in het barbestand
# A/bar.py
from foo import YourClass
Het doel van de __init__.py
-bestanden is om optionele initialisatiecode op te nemen die wordt uitgevoerd wanneer verschillende niveaus van een pakket worden aangetroffen. alles wat u in de __init__.py
plaatst, wordt geïnitialiseerd tijdens het laden van het pakket.
Antwoord 15
Gewoon te kort,
Maak een bestand __init__.py
in de klassendirectory en importeer het vervolgens in uw script zoals het volgende (Importeer alle hoofdletters)
from classes.myscript import *
Alleen geselecteerde lessen importeren
from classes.myscript import User
from classes.myscript import Dir
Antwoord 16
Python3
gebruik
from .user import User inside dir.py file
en
use from class.dir import Dir inside main.py
or from class.usr import User inside main.py
vind ik leuk
Antwoord 17
om uit dezelfde map te importeren
from . import the_file_you_want_to_import
om te importeren uit de submap die de map moet bevatten
init.py
andere bestanden dan je bestanden dan
uit map importeer uw_bestand