Programação

Classes e objetos: o que são e como criar

Atualizado em

Capa do artigo Classes e objetos: o que são e como criar
Leitura com foco

Entenda o contexto.
Leve para a prática.

Neste artigo
  1. O que é uma classe?
  2. O que é um objeto?
  3. Como criar classes e objetos em Python, PHP e C?
  4. O que acontece quando duas variáveis recebem o mesmo objeto?
  5. Aí você pergunta: qual é a diferença entre classe e objeto?
  6. Quais são os erros mais comuns com classes e objetos?
  7. Agora é com você!

Classe é o molde que descreve um tipo de coisa: quais características ela tem (os atributos) e o que ela sabe fazer (os métodos). Objeto é cada coisa criada a partir desse molde.

No artigo sobre escopo, você viu que cada função tem o seu próprio quadrado. A classe é um quadrado maior, um “super escopo”: dentro dela ficam juntas as variáveis e as funções que representam uma mesma coisa.

Você já parou para pensar por que sabe que uma zebra é uma zebra? Alguém mostrou uma e você pensou: parece um cavalo, mas tem listras pretas e brancas. Então a zebra é um cavalo de pijama? Não! Você observou as características que separam uma zebra de um cavalo. Essas características são os atributos. Depois você reparou no que ela faz: anda, come, corre. Essas ações são os métodos. Sem perceber, você montou uma classe na cabeça.

O que é uma classe?

É uma descrição. Ela diz como os objetos daquele tipo são por dentro: quais atributos guardam e quais métodos oferecem. Criar uma classe é criar um tipo novo, do mesmo jeito que já existem os tipos inteiro e texto.

Vamos trocar a zebra por uma pessoa. Uma classe Pessoa pode ter:

  • Atributos (o que ela tem): nome, idade e altura.
  • Métodos (o que ela faz): andar, falar e fazer aniversário.
A classe Pessoa, com atributos e métodos, e dois objetos criados a partir dela, walmir e ana, cada um com os seus valores
A classe Pessoa e dois objetos criados a partir dela. O molde é um só, e cada objeto tem os seus valores.

O que é um objeto?

É uma instância da classe: uma pessoa de verdade, com valores nos atributos. Pense comigo: dá para dizer se uma pessoa é alta sem saber a altura dela? Não dá. A classe só diz que toda pessoa tem uma altura. Quem tem 180 centímetros é o objeto. Criar um objeto a partir da classe se chama instanciar.

Ver a animação da criação de um objeto
Animação da criação de um objeto: a classe Pessoa recebe os valores, o construtor preenche nome, idade e altura, e os métodos passam a agir sobre o objeto
A classe recebe os valores, o construtor preenche os atributos, e a partir daí os métodos agem sobre aquele objeto.

Como criar classes e objetos em Python, PHP e C?

O Python e o PHP têm a palavra class. O C não tem: tentei compilar uma linha começando com class, e o GCC respondeu “unknown type name ‘class'”. No programa em C, o molde é uma struct, que guarda os atributos, e as ações são funções que recebem a pessoa. O resultado na tela é o mesmo.

Python:

# Classes e objetos: o molde e os objetos criados a partir dele

class Pessoa:
    def __init__(self, nome, idade, altura):
        self.nome = nome        # atributos: as características
        self.idade = idade
        self.altura = altura

    def andar(self):            # métodos: as ações
        print("%s está andando" % self.nome)

    def falar(self, frase):
        print("%s diz: %s" % (self.nome, frase))

    def fazer_aniversario(self):
        self.idade = self.idade + 1

walmir = Pessoa("Walmir", 20, 180)
ana = Pessoa("Ana", 30, 165)

walmir.andar()
ana.falar("Confiança sempre!")
print("%s tem %d anos e %d cm" % (walmir.nome, walmir.idade, walmir.altura))
print("%s tem %d anos e %d cm" % (ana.nome, ana.idade, ana.altura))

walmir.fazer_aniversario()
print("Depois do aniversário: %s tem %d anos e %s tem %d anos" % (walmir.nome, walmir.idade, ana.nome, ana.idade))

# duas variáveis podem apontar para o mesmo objeto
apelido = walmir
apelido.fazer_aniversario()
print("Pelo apelido, mais um aniversário: %s tem %d anos" % (walmir.nome, walmir.idade))

PHP:

<?php
// Classes e objetos: o molde e os objetos criados a partir dele

class Pessoa
{
    public string $nome;        // atributos: as características
    public int $idade;
    public int $altura;

    public function __construct(string $nome, int $idade, int $altura)
    {
        $this->nome = $nome;
        $this->idade = $idade;
        $this->altura = $altura;
    }

    public function andar(): void   // métodos: as ações
    {
        printf("%s está andando\n", $this->nome);
    }

    public function falar(string $frase): void
    {
        printf("%s diz: %s\n", $this->nome, $frase);
    }

    public function fazerAniversario(): void
    {
        $this->idade = $this->idade + 1;
    }
}

$walmir = new Pessoa("Walmir", 20, 180);
$ana = new Pessoa("Ana", 30, 165);

$walmir->andar();
$ana->falar("Confiança sempre!");
printf("%s tem %d anos e %d cm\n", $walmir->nome, $walmir->idade, $walmir->altura);
printf("%s tem %d anos e %d cm\n", $ana->nome, $ana->idade, $ana->altura);

$walmir->fazerAniversario();
printf("Depois do aniversário: %s tem %d anos e %s tem %d anos\n", $walmir->nome, $walmir->idade, $ana->nome, $ana->idade);

// duas variáveis podem apontar para o mesmo objeto
$apelido = $walmir;
$apelido->fazerAniversario();
printf("Pelo apelido, mais um aniversário: %s tem %d anos\n", $walmir->nome, $walmir->idade);

C:

/* Classes e objetos: em C não há class; o molde é uma struct e as ações são funções */
#include <stdio.h>

struct Pessoa {
    const char *nome;       /* atributos: as características */
    int idade;
    int altura;
};

void andar(const struct Pessoa *pessoa) {   /* as ações recebem a pessoa */
    printf("%s está andando\n", pessoa->nome);
}

void falar(const struct Pessoa *pessoa, const char *frase) {
    printf("%s diz: %s\n", pessoa->nome, frase);
}

void fazer_aniversario(struct Pessoa *pessoa) {
    pessoa->idade = pessoa->idade + 1;
}

int main(void) {
    struct Pessoa walmir = {"Walmir", 20, 180};
    struct Pessoa ana = {"Ana", 30, 165};

    andar(&walmir);
    falar(&ana, "Confiança sempre!");
    printf("%s tem %d anos e %d cm\n", walmir.nome, walmir.idade, walmir.altura);
    printf("%s tem %d anos e %d cm\n", ana.nome, ana.idade, ana.altura);

    fazer_aniversario(&walmir);
    printf("Depois do aniversário: %s tem %d anos e %s tem %d anos\n", walmir.nome, walmir.idade, ana.nome, ana.idade);

    /* duas variáveis podem apontar para a mesma pessoa */
    struct Pessoa *apelido = &walmir;
    fazer_aniversario(apelido);
    printf("Pelo apelido, mais um aniversário: %s tem %d anos\n", walmir.nome, walmir.idade);
    return 0;
}

Saída:

Walmir está andando
Ana diz: Confiança sempre!
Walmir tem 20 anos e 180 cm
Ana tem 30 anos e 165 cm
Depois do aniversário: Walmir tem 21 anos e Ana tem 30 anos
Pelo apelido, mais um aniversário: Walmir tem 22 anos

Foque no conceito, e não na linguagem! Repare no que muda só na escrita:

  • O construtor: é o método que roda quando o objeto é criado e preenche os atributos. No Python, ele se chama __init__. No PHP, __construct.
  • A palavra para “este objeto”: dentro dos métodos, o Python usa self e o PHP usa $this. É por ela que o método alcança os atributos do próprio objeto.
  • A criação: o PHP usa a palavra new. O Python chama a classe como se fosse uma função.
  • O acesso: o Python usa o ponto (walmir.nome). O PHP usa a seta (->).

O que acontece quando duas variáveis recebem o mesmo objeto?

Olhe a última linha da saída. A linha apelido = walmir não criou outra pessoa: as duas variáveis passaram a apontar para o mesmo objeto. Quando o aniversário foi feito pelo apelido, a idade do walmir foi de 21 para 22.

As variáveis walmir e apelido apontando para o mesmo objeto Pessoa, com idade 22
Atribuir um objeto a outra variável não copia o objeto. As duas variáveis chegam à mesma pessoa.

ATENÇÃO: no C, a struct se comporta de outro jeito. Testei uma atribuição direta de uma struct a outra variável, e ela copiou tudo: aumentei a idade da cópia para 21 e a original continuou com 20. Por isso o apelido do programa em C é um ponteiro para a pessoa. No PHP, quando você quer mesmo uma cópia separada, existe a palavra clone: no teste, mudei o nome da cópia e o original continuou “Walmir”.

Aí você pergunta: qual é a diferença entre classe e objeto?

A classe é uma só, e os objetos são quantos você quiser. No programa, a classe Pessoa aparece uma vez e dá origem a dois objetos, o walmir e a ana. Cada um guarda os seus valores: o aniversário do walmir levou a idade dele para 21, e a ana continuou com 30. Classe é o conceito. Objeto é o caso concreto.

Quais são os erros mais comuns com classes e objetos?

  • Chamar um método direto na classe, sem criar o objeto. No Python, Pessoa.andar() parou com “TypeError: Pessoa.andar() missing 1 required positional argument: ‘self'”. No PHP, Pessoa::andar() parou com “Error: Non-static method Pessoa::andar() cannot be called statically”.
  • Esquecer o self na definição do método, no Python. A chamada parou com “TypeError: Q.andar() takes 0 positional arguments but 1 was given”.
  • Usar um atributo que não existe. Pedi o peso de uma pessoa que só tinha nome. O Python parou com “AttributeError: ‘Pessoa’ object has no attribute ‘peso'”. O PHP mostrou “Warning: Undefined property: Pessoa::$peso”.
  • Achar que atribuir o objeto a outra variável cria uma cópia. As duas variáveis apontam para o mesmo objeto.
  • Achar que mudar um objeto muda os outros da mesma classe. Cada objeto tem os seus valores.

Agora é com você!

No papel:

  • Escolha uma coisa do seu dia a dia, como um carro ou uma conta de banco, e liste três atributos e três métodos.
  • No programa do artigo, quantas classes existem? E quantos objetos?
  • Depois de ana.fazer_aniversario() duas vezes, quanto valem a idade da ana e a idade do walmir?

No computador:

  • Crie a classe Produto, com nome e preço, e um método que aplica um desconto no preço.
  • Crie dois produtos e aplique o desconto em um só. Confira que o outro não mudou.
  • Acrescente à classe Pessoa um método que diz se a pessoa é maior de idade.

Tente sozinho, sem pedir a resposta pronta para ninguém, nem para a IA!

Classes e objetos são a porta de entrada da Programação Orientada a Objetos. É o assunto do próximo artigo. Até lá!

Confiança Sempre!!!

Fontes:

Sobre quem escreve

Walmir Silva

Olá! Sou Walmir, engenheiro de software com MBA em Engenharia de Software e o cérebro por trás do GrowthCode e autor do livro "Além do Código".

Se você acha que programação é apenas sobre escrever código, prepare-se para expandir seus horizontes. Aqui, nós vamos além do código e exploramos as interseções fascinantes entre tecnologia, negócios, artes e filosofia.

Você está em busca de crescimento na carreira? Quer se destacar em um mercado competitivo? Almeja uma vida mais rica em conhecimento e realização? Então você chegou ao lugar certo. No GrowthCode, oferecemos insights profundos, estratégias comprovadas e um toque de sabedoria filosófica para catalisar seu crescimento pessoal e profissional.

Ver todos os artigos →

Continue a conversa

Compartilhe sua perspectiva

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Encontre sua próxima resposta

O que você quer aprender?

Preferências de cookies

Os cookies opcionais começam desligados. Você pode mudar a escolha a qualquer momento por esta tela.

NecessáriosSempre ativos

Guardam a sua escolha de cookies e mantêm o site funcionando. Não são usados para publicidade.

Contam visitas e mostram como o site é usado: Google Analytics e Microsoft Clarity, carregados pelo Google Tag Manager. Como esse contêiner também carrega tags de publicidade, as estatísticas só são ativadas junto com Publicidade e marketing.

Exibem anúncios do Google AdSense e medem campanhas e e-mails: pixels da Meta e do TikTok e o Mautic.

Permite que o Google escolha anúncios com base nos seus interesses. Desligado, os anúncios aparecem sem personalização. Depende de Publicidade e marketing.

Também é possível bloquear cookies nas configurações do navegador. Detalhes na Política de privacidade.