partialmethod: crie métodos especializados no Python

Publicado em: 30/08/2026
Tempo de leitura: 3 minutos
Detailed view of computer code highlighting syntax in colors on a screen.

functools.partialmethod permite definir métodos com alguns argumentos já preenchidos, preservando o comportamento de binding do descriptor. Ele é semelhante a functools.partial, mas foi criado especificamente para funcionar dentro do corpo de uma classe.

O recurso é útil para criar atalhos sem duplicar métodos, especializar comandos, configurar flags e expor operações de domínio com nomes claros.

Primeiro exemplo

from functools import partialmethod

class Porta:
    def alterar(self, estado, *, registrar=True):
        self.estado = estado
        if registrar:
            print("estado:", estado)

    abrir = partialmethod(alterar, "aberta")
    fechar = partialmethod(alterar, "fechada")

porta = Porta()
porta.abrir()
porta.fechar(registrar=False)

self continua sendo inserido automaticamente. Os argumentos fixados aparecem depois do binding do método.

Diferença para partial

from functools import partial

class Exemplo:
    def metodo(self, valor):
        return valor

    atalho_incorreto = partial(metodo, 10)

partial é um objeto chamável comum e não implementa o mesmo comportamento de descriptor para inserir self. partialmethod existe para resolver essa diferença.

Argumentos posicionais e nomeados

class Cliente:
    def requisitar(self, metodo, caminho, *, timeout=10):
        ...

    obter = partialmethod(requisitar, "GET")
    criar = partialmethod(requisitar, "POST", timeout=30)

O chamador ainda pode fornecer os argumentos restantes e, quando permitido, sobrescrever keywords.

Sem duplicação de wrappers

Uma alternativa seria escrever vários métodos que apenas chamam outro. partialmethod reduz boilerplate quando não há lógica adicional. Se o wrapper precisa validar, registrar métricas específicas ou adaptar erros, um método explícito costuma ser mais claro.

Integração com descriptors

Se o primeiro argumento já é um descriptor, como classmethod, staticmethod ou outro partialmethod, a resolução é delegada ao descriptor original.

class Conversor:
    @classmethod
    def criar(cls, formato, valor):
        return cls(formato, valor)

    de_json = partialmethod(criar, "json")

Teste a ordem dos decorators e o comportamento na versão mínima do Python suportada.

Métodos abstratos

Em hierarquias com abc, o estado abstrato pode ser propagado pelo descriptor. Porém, APIs complexas ficam mais fáceis de entender com métodos abstratos explícitos e implementações concretas simples.

Assinatura e introspecção

Ferramentas podem exibir uma assinatura adaptada, mas nem toda biblioteca de documentação interpreta descriptors da mesma forma. Use inspect.signature nos métodos vinculados e teste a documentação gerada.

import inspect

print(inspect.signature(Porta().abrir))

O guia interno sobre inspect.signature aprofunda a análise de callables.

Herança

O método parcial usa a resolução normal do atributo subjacente. Se uma subclasse sobrescrever o método base, verifique se o atalho deve acompanhar a sobrescrita ou permanecer ligado à função original definida no descriptor.

Keywords mutáveis

Evite fixar objetos mutáveis que serão modificados entre chamadas. Assim como em argumentos padrão, compartilhar uma lista ou dicionário pode criar estado inesperado.

APIs de domínio

class Consulta:
    def filtrar(self, operador, campo, valor):
        ...

    igual = partialmethod(filtrar, "eq")
    maior_que = partialmethod(filtrar, "gt")

Nomes de domínio tornam chamadas legíveis sem repetir a implementação geral.

Erros comuns

  • Usar partial no corpo da classe esperando binding de método.
  • Fixar argumentos na ordem errada.
  • Esconder lógica importante em muitos atalhos.
  • Ignorar assinaturas e documentação.
  • Compartilhar keywords mutáveis.

Boas práticas

Use partialmethod para especializações simples, escolha nomes claros, mantenha poucos níveis de composição e escreva testes de binding em classe, instância e subclasses. Veja também o guia interno sobre functools.partial.

Conclusão

functools.partialmethod cria métodos especializados sem perder a inserção automática de self ou cls. Ele reduz wrappers repetitivos, mas deve ser reservado para especializações transparentes.

Fontes externas

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    Banco SQLite e código Python para exportação seletiva com iterdump
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    SQLite iterdump: crie dumps seletivos no Python

    Aprenda sqlite3.Connection.iterdump com filtro para gerar dumps seletivos, validar dependências e restaurar bancos com segurança.

    Ler mais

    Tempo de leitura: 5 minutos
    21/10/2026
    Código e arquivos representando compressão de dados no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    compression.zstd: Zstandard rápido no Python

    Aprenda a usar compression.zstd no Python para comprimir e descomprimir dados com desempenho, streaming e segurança.

    Ler mais

    Tempo de leitura: 7 minutos
    21/10/2026
    Arquivo de configuração e estrutura de código para ConfigParser no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    ConfigParser: leia INI sem seção no Python

    Aprenda a ler arquivos INI sem cabeçalho usando ConfigParser, com validação, tipos, compatibilidade e escrita segura.

    Ler mais

    Tempo de leitura: 5 minutos
    20/10/2026
    Dados binários e memória de computador representando memoryview no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    memoryview count e index: busque sem copiar

    Aprenda memoryview count e index no Python para buscar valores em buffers sem cópias e validar dados binários com eficiência.

    Ler mais

    Tempo de leitura: 5 minutos
    20/10/2026
    Desenvolvedora trabalhando com código Python e validação de dados
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    map strict: detecte iteráveis desalinhados

    Aprenda map strict no Python para validar iteráveis, evitar truncamento silencioso e detectar dados desalinhados.

    Ler mais

    Tempo de leitura: 6 minutos
    19/10/2026
    Pastas organizadas representando arquivos e diretórios no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    pathlib.Path.info: acelere varreduras de diretórios

    Aprenda pathlib.Path.info no Python para consultar tipos de arquivos com cache, reduzir chamadas ao sistema e evitar dados desatualizados.

    Ler mais

    Tempo de leitura: 6 minutos
    19/10/2026