Classes

Uma classe é uma estrutura que representa um objeto e um conjunto de operações que podem ser executadas sobre o objeto.

Objetos possuem um tipo, uma representação interna (campos), e provêm uma interface (métodos). As informações (campos) de um objeto são chamadas de atributos do objeto, e as operações realizadas sobre o objeto são chamadas métodos do objeto/classe.

Em linhas gerais, um método é uma função que funciona somente dentro da classe, isto é, somente quando invocado por objetos da classe, seguindo uma sintaxe específica: objeto.metodo. Além disso, ao invocar um método, Python sempre passa como primeiro parâmetro para o método o objeto que está invocando o método. Para indicar isso, a convenção é declarar self como primeiro parâmetro de todo método.

Exemplos de classe

Vamos começar com um exemplo simples de classe, uma classe para armazenar informações básicas de uma pessoa.

class Pessoa:
    """Armazena informações básicas de uma pessoa."""
    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade

    def get_nome(self):
        return self.nome

    def get_idade(self):
        return self.idade

# Usando a classe.
p1 = Pessoa("João", 20)
print("O {} tem {} anos.".format(p1.get_nome(), p1.get_idade()))
O João tem 20 anos.

No exemplo acima, a classe armazena o nome e a idade de uma pessoa. Criamos os métodos get_nome() e get_idade() para recuperar o nome e a idade da pessoa em questão. Poderíamos também ter acessado os campos nome e idade por meio das operações p1.nome e p1.idade. Entretanto, sempre que temos os chamados “métodos acessórios” (métodos usados para acessar campos de uma classe), é melhor usá-los em vez de acessar as propriedades diretamente.

Vejamos agora um exemplo mais complicado de classe em Python.

O exemplo abaixo cria uma classe para representar um vetor em Python. Esse exemplo foi tirado do livro Python Fluente, e seu código-fonte pode ser encontrado no repositório do livro no github.

from math import hypot

class Vector:
    """Representa um vetor em Python."""
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __str__(self):
        return 'Vector(%r, %r)' % (self.x, self.y)

    def __abs__(self):
        return hypot(self.x, self.y)

    def __bool__(self):
        return bool(abs(self))

    def __add__(self, other):
        x = self.x + other.x
        y = self.y + other.y
        return Vector(x, y)

    def mul(self, scalar):
        return Vector(self.x * scalar, self.y * scalar)

Pela definição da classe acima, notamos que:

Para criar um novo objeto da classe Vector, podemos fazer como abaixo:

v1 = Vector(10, 20) # O método __init__ será chamado.
print(v1)           # O método __str__ será chamado.

v2 = Vector(30, 40) # O método __init__ será chamado.
print(v2)           # O método __str__ será chamado.
Vector(10, 20)
Vector(30, 40)

Chamando um método da classe:

print(v.mul(5))
Vector(50, 100)

Pelos exemplos acima, vemos que o uso de uma classe em Python envolve:

Vemos ainda que objetos diferentes de uma mesma classe guardam estados diferentes (v1 e v2 possuem valores distintos), ou seja, é possível ter inúmeros objetos de um mesmo tipo no mesmo programa, cada um possuindo um estado diferente dos demais.

Para mais detalhes sobre o funcionamento de classes em Python, veja o tutorial Python.


Leitura Complementar