Софтуерно Инженерство
Loading...
+ Нов въпрос
makkasi avatar makkasi 0 Точки

Какво представлява __init__.py

Въпроса е към видеото https://www.youtube.com/watch?v=TP29obREGv4#t=4962 и просто го копирам тук:

 

Понеже не се вижда много добре на камерата и на мен не ми стана ясно нещо. Модулите са самостоятелни py файлове. Пакетите са папки с _init_.py . Въпроса е Python като какъв го вижда този файл? Може ли да се пишат команди в него. Има ли някаква специфика при зареждане, като например, ако има няколко вложени пакета и има няколко лога във всеки от _init_.py , как ще се изпълнят отвътре навън или отвън навътре? Може ли да гледаме на пакетите като на Обекти които се наследяват? Във този смисъл ако импортна вътрешен модул за даден пакет, той има ли достъп до модулите на външния пакет.

0
Python
boris.chervenkov avatar boris.chervenkov 18 Точки
Best Answer

Здравей,

модулът __init__.py  се зарежда и изпълнява при импорт на пакета, или на модул от пакета, а съдържанието му се асоциира с името на пакета.

За да стане малко по-ясно, ще използваме примера от лекцията за ООП. Имаме пакет figures и в него имаме модул base.py, и можем да си направим следния експеримент:

пакет figures - файл figures/__init__.py

print("Package 'figures' imported.")

пакет figures - файл figures/base.py

print("Module 'figures.base' imported.")


class Figure:

    def __init__(self, center_x, center_y, color='black', **kwargs):
        self.center_x = center_x
        self.center_y = center_y
        self.color = color

    def __str__(self):
        return "Figure center: {}:{}, color: {}".format(self.center_x, self.center_y, self.color)

    def draw(self, turtle):
        pass

 

Тогава ако импортираме само пакета figures в main.py:

import figures

print("Message from main file")

и стартираме този файл, ще видим следните съобщения:

$ python3 main.py

Package 'figures' imported.
Message from main file

т.е. файлът __init__.py се зарежда при импорт на пакета. Трябва да се има предвид, че това става само веднъж, т.е. ако от друг файл в програмата също се импортира пакета figures , кодът в __init__.py няма да се изпълни отново, а ще се използва вече заредения от интерпретатора код - също както с нормалните модули.

Ако в main.py импортираме директно клас Figure от модула figures.base така:

from figures.base import Figure

f = Figure(0, 0)
print("From main file: ", f)

Тогава при стартиране на този файл в конзолата ще видим:

python3 main.py

Package 'figures' imported.
Module 'figures.base' imported.
From main file:  Figure center: 0:0, color: black

С други думи ако импортираме пакета или модул от пакета, файлът __init__.py ще се изпълни.


__init__.py е просто модул, и в него може да има всякакъв код, който може да има и в обикновен модул.

Най-често в __init__.py се слагат imports към вътрешни за пакета неща (функции, класове, константи и т.н.), с цел да се предостави удобен "интерфейс" към тях, без да е необходимо този, който използва пакета, да знае кой точно подмодул на пакета за какво отговаря.

Например, можем да имаме следния figures/__init__.py (пак от примера от лекцията):

from .base import Figure
from .simple import Circle, Square

И тогава ако искам да използвам пакета figures, мога да го направя така, без да се интересувам кой клас в кой точно подмодул е бил дефиниран (т.е. не се интересувам от вътрешната структура на пакета):

main.py

from figures import Circle, Square

c = Circle(0, 0, radius=76, color='red')
print(c)

 

7
makkasi avatar makkasi 0 Точки

Благодаря, повече от изчерпателен отговор. Явно в лекцията за ООП стават ясни доста неща. Ако има други въпрости след нея ще питам.

0