Agora vamos entender o que são pacotes.

Pacotes são módulos também. Eles são apenas embalados de forma diferente. Eles são formados pela combinação de um diretório mais o arquivo __init__.py. Eles são módulos que podem conter outros módulos, isto é, uma coleção de módulos em diretórios que fornecem uma hierarquia de pacotes. Em sua definição precisa, um módulo é um objeto na memória de um interpretador Python, geralmente criado pela leitura de um ou mais arquivos no disco.

Módulos e Pacotes é a maneira do Python organizar e estruturar códigos.

Um pacote é uma coleção de módulos em uma pasta. O nome do pacote é o nome da pasta.

Pacotes são identificados pelo interpretador pela presença de um arquivo com o nome "__init__.py". O arquivo "__init__.py" pode ser vazio ou conter algum código de inicialização do pacote ou definir uma variável chamada __all__, com uma lista de módulos do pacote que serão importados quando for usado "*". Sem o arquivo __init__.py, o Python não identifica a pasta como um pacote válido. Os dois __init__.py do exemplo dessa aula são arquivos vazios, tanto o do pacote ecommerce como o do pacote payments. Veja abaixo a seguinte estrutura de pastas:
parent_directory/
    main.py
    ecommerce/
        __init__.py
        database.py
        products.py
        payments/
            __init__.py
            paypal.py
            authorizenet.py
Crie esses arquivos nessa hierarquia de pastas: parent_directory/main.py

"""Módulo principal.
"""
import ecommerce.products
from ecommerce.payments.paypal import PayPal

def main():
    """Função principal da aplicação.
    """
    product = ecommerce.products.Product()
    print(product)

    PayPal()


if __name__ == "__main__":
    main()
parent_directory/ecommerce/products.py
#Um ponto só no import, porque o database.py tá na mesma pasta
from .database import Database

class Product:
    '''Essa é a classe produto'''
    database = Database()
    
    if database:
        print("Eu importei um database")
    
    def __str__(self):
        return str("Eu sou um produto!")
parent_directory/ecommerce/database.py

class Database: # the database implementation
    def __str__(self):
        return str("Eu sou um database!")

database = None

def initialize_database():
    global database

database = Database()
Nós adiamos a criação do banco de dados até que seja realmente necessário chamando a função initialize_database para criar a variável do módulo database. parent_directory/ecommerce/payments/authorizenet.py

class Authorizenet:
    '''Essa é a classe Authorizenet'''
    pass
parent_directory/ecommerce/payments/paypal.py

from ..database import Database

class PayPal:
    '''Essa é a classe PayPal'''
    database = Database()
    if database:
    	print("Eu sou o paypal do módulo payments, eu importei e instanciei um database")
O uso do comando pass é apenas para não precisar definir uma classse ou função, como aqui são apenas exemplos, não queremos que o python reclame pelo fato de definir uma classe ou função e não fazer nada dentro delas.

O pass serve literalmente para deixar passar.

Veja como os imports dos pacotes e seus módulos funcionaram.

Através dos prints dos códigos acima, dá para entender como funciona a hierarquia de pastas e módulos na estrutura mostrada como exemplo.

Aproveito para deixar meu link de afiliados na Hostinger, tá valendo a pena, dêem uma olhada: Hostinger

Dêem um joinha 👍 na página do Código Fluente no Facebook Facebook

Esse é meu link de referidos na digitalocean pra vocês.

Quem se cadastrar por esse link, ganha $100.00 dólares de crédito na digitalocean:

Digital Ocean

Esse outro link é da one.com:

One.com

Obrigado, até a próxima e bons estudos. ;)