English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Explicação Detalhada da Função do Arquivo __init__.py no Python

O arquivo __init__.py tem a função de transformar uma pasta em um módulo Python. Em cada pacote do Python, há um arquivo __init__.py.

Normalmente, o arquivo __init__.py está vazio, mas podemos adicioná-lo outras funcionalidades. Ao importar um pacote, na verdade estamos importando seu arquivo __init__.py. Dessa forma, podemos importar em massa os módulos necessários no arquivo __init__.py, sem a necessidade de importar um a um.

# package
# __init__.py
import re
import urllib
import sys
import os
# a.py
import package 
print(package.re, package.urllib, package.sys, package.os)

Atenção, ao acessar arquivos referenciados no arquivo __init__.py, é necessário adicionar o nome do pacote.

__init__.py também possui uma variável importante, __all__, que é usada para importar todos os módulos.

# __init__.py
__all__ = ['os', 'sys', 're', 'urllib']
# a.py
from package import *

Neste caso, os módulos e pacotes registrados na lista __all__ do arquivo __init__.py serão importados para o arquivo atual.

Pode-se entender que __init__.py controla principalmente o comportamento de importação de pacotes. Para entender completamente o papel do arquivo __init__.py, é necessário saber mais sobre o mecanismo de referência de instruções import:

Os objetos que podem ser importados através de uma instrução import são os seguintes tipos:

• arquivos de módulos (.py)

• C ou C++; extensões (compiladas como bibliotecas compartilhadas ou DLLs)

• pacotes (contendo múltiplos módulos)

• módulos embutidos (escritos em C e ligados ao interpretador Python)

ao importar módulos, o interpretador busca os arquivos de importação na ordem das diretórios listados em sys.path.

import sys
>>> print(sys.path)
# Linux:
['', '']/usr/local/lib/python3.4',
'/usr/local/lib/python3.4/plat-sunos5',
'/usr/local/lib/python3.4/lib-tk',
'/usr/local/lib/python3.4/lib-dynload',
'/usr/local/lib/python3.4/site-packages
# Windows:
['', 'C:\\WINDOWS\\system32\\python34.zip34\\DLLs34\\lib', 'C:\\Python34\\lib\\plat-win34\\lib\\lib-tk34\\Lib\\site-packages\\pythonwin34', 'C:\\Python34\\lib\\site-packages34\\lib\\site-packages\\win32', 'C:\\Python34\\lib\\site-packages\\win32\\lib', 'C:\\Python34\\lib\\site-packages\\wx-2.6-msw-unicode'

O primeiro elemento da lista list é uma string vazia, representando o diretório atual.

Sobre os arquivos .pyc e .pyo

A montagem do arquivo .py, só é feita quando a instrução import é executada, quando o arquivo .py é importado pela primeira vez, ele é montado em código de bytes e o código de bytes é escrito no arquivo .pyc同名. Em seguida, cada operação de importação direta executará o arquivo .pyc (quando o tempo de modificação do arquivo .py muda, isso gerará um novo arquivo .pyc), quando o interpretador usar-Quando a opção O é usada, será usado o arquivo .pyo com o mesmo nome, esse arquivo remove os assert, números de linha de quebra e outras informações de depuração, é menor em tamanho e mais rápido no funcionamento. (Uso-Opção OO, o arquivo .pyo gerado ignorará as informações de documentação)

Importar módulo

Os módulos geralmente são arquivos.py separados, que podem ser referenciados diretamente com import, os tipos de arquivo que podem ser usados como módulos incluem .py, .pyo, .pyc, .pyd, .so, .dll

Ao importar um módulo, o interpretador faz o seguinte trabalho:

1Cria um novo espaço de nomes com o nome do módulo importado, através do qual você pode acessar os atributos e métodos do módulo importado.

2Executa o arquivo de código-fonte no espaço de nomes recém-criado.

3Cria um objeto chamado arquivo de código-fonte, que referencia o espaço de nomes do módulo, permitindo assim acessar as funções e variáveis do módulo através deste objeto.

A instrução import pode ser usada em qualquer local do programa, você pode importar o mesmo módulo várias vezes no programa, mas o código do módulo é executado apenas quando o módulo é importado pela primeira vez. As instruções import subsequentes apenas criam uma referência ao espaço de nomes do módulo.

O dicionário sys.modules armazena o mapeamento do nome do módulo para o objeto do módulo de todos os módulos importados.

Importar pacote

Múltiplos módulos relacionados podem formar um pacote, facilitando a manutenção e uso, e limitando o conflito de espaço de nomes. Geralmente, a estrutura do pacote pode ser assim:

package
|- subpackage1
|- __init__.py
|- a.py
|- subpackage2
|- __init__.py
|- b.py

Existem várias maneiras de importar:

import subpackage1.a # Importa o módulo subpackage.a para o espaço de nomes global, por exemplo, acessa a propriedade usando subpackage1.a.attr
from subpackage1 import a # Importa o módulo a para o espaço de nomes global, por exemplo, acessa a propriedade usando a.attr_a
from subpackage.a import attr_a # Importa a propriedade do módulo a diretamente para o espaço de nomes, por exemplo, acessa a propriedade usando attr_a 
A instrução from pode importar módulos diretamente para o espaço de nomes atual, a instrução from não cita o espaço de nomes do objeto importado, mas introduz o objeto importado diretamente no espaço de nomes atual.

Aqui está uma explicação detalhada do arquivo __init__.py no Python, apresentada pelo editor. Esperamos que isso ajude. Se tiver alguma dúvida, deixe um comentário e o editor responderá o mais rápido possível. Agradecemos também o apoio ao site Tutorial de Grito!

Declaração: O conteúdo deste artigo é extraído da Internet, pertencente ao respectivo proprietário. O conteúdo é fornecido voluntariamente pelos usuários da Internet e carregado automaticamente. Este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade legal. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para notice#w.3Aviso: Para denunciar, envie um e-mail para codebox.com (substitua # por @) e forneça provas relevantes. Caso seja confirmada, o conteúdo suspeito de violação de direitos autorais será imediatamente removido do site.

Você também pode gostar