Classes e Objetos - Python
O Python possui vários tipos embutidos, como int, str, entre outros, que podemos usar em um programa. Além disso, permite a criação de tipos personalizados usando classes. Uma classe representa uma entidade, e um objeto é a concretização específica dessa classe.
Podemos usar uma analogia para entender o conceito. Todos nós temos uma ideia de uma pessoa, que possui nome, idade e outras características, e que pode realizar ações, como caminhar, correr e pensar. Esse conjunto de características e ações representa um "molde" que podemos chamar de classe. A concretização desse molde varia entre as pessoas: cada uma tem um nome e características próprios. Cada pessoa específica representaria um objeto dessa classe.
Em Python, uma classe é definida com a palavra-chave class
class NomeDaClasse:
atributos_da_classe
métodos_da_classe
Dentro da classe, definimos seus atributos (características) e métodos (funções). A seguir, um exemplo básico:
class Person:
pass
Aqui, a classe Person
pass
Uma vez que a classe foi definida, podemos criar objetos dela:
class Person:
pass
tom = Person() # criação do objeto tom
bob = Person() # criação do objeto bob
No exemplo acima, tom
bob
Person
Person()
Construtores
O construtor é responsável pela criação dos objetos da classe. No exemplo anterior, usamos o construtor padrão sem parâmetros, disponível para todas as classes. Porém, podemos definir explicitamente um construtor na classe usando o método especial __init__()
class Person:
def __init__(self):
print("Criando um objeto Person")
tom = Person() # Exibe: "Criando um objeto Person"
No código acima, definimos um construtor para a classe Person
self
Ao criar um objeto:
tom = Person()
o construtor __init__()
__init__
self
Atributos de Objeto
Os atributos guardam o estado do objeto e podem ser definidos e configurados usando a palavra-chave self
Atributos de Objeto
Os atributos guardam o estado do objeto e podem ser definidos e configurados usando a palavra-chave self
class Person:
def __init__(self, name, age):
self.name = name # nome da pessoa
self.age = age # idade da pessoa
tom = Person("Tom", 22)
# acessando atributos
print(tom.name) # Saída: Tom
print(tom.age) # Saída: 22
# modificando atributos
tom.age = 37
print(tom.age) # Saída: 37
Aqui, o construtor da classe Person agora recebe name
age
self.name
name
self.age
age
Quando chamamos o construtor com argumentos:
tom = Person("Tom", 22)
o parâmetro name
age
Também podemos criar diferentes objetos da classe Person
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
tom = Person("Tom", 22)
bob = Person("Bob", 43)
print(tom.name) # Saída: Tom
print(bob.name) # Saída: Bob
Nesse exemplo, criamos dois objetos da classe Person
tom
bob
self
tom
bob
Não é obrigatório definir todos os atributos dentro da classe; Python permite a criação de atributos dinamicamente, fora do código da classe:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
tom = Person("Tom", 22)
tom.company = "Microsoft"
print(tom.company) # Saída: Microsoft
Aqui, o atributo company
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
tom = Person("Tom", 22)
print(tom.company) # AttributeError: 'Person' object has no attribute 'company'
Métodos de Classe
Os métodos de uma classe são funções definidas dentro da classe que determinam seu comportamento. Vamos ver um exemplo com a classe Person
class Person: # definição da classe Person
def say_hello(self):
print("Hello")
tom = Person()
tom.say_hello() # Saída: Hello
Aqui, definimos o método say_hello()
self
self
Usando o nome do objeto, podemos acessar seus métodos. Para isso, usamos a notação de ponto: escrevemos o nome do objeto seguido por um ponto e, em seguida, chamamos o método:
objeto.metodo([parâmetros opcionais do método])
Por exemplo, ao chamar o método say_hello()
tom.say_hello() # Saída: Hello
A execução do código acima exibe "Hello" no console.
Se o método precisar de outros parâmetros, eles são definidos após self
class Person: # definição da classe Person
def say(self, message): # método que recebe uma mensagem
print(message)
tom = Person()
tom.say("Hello Programício") # Saída: Hello Programício
Neste caso, say()
self
message
message
Para acessar atributos e métodos do objeto dentro da própria classe, também usamos self
self.atributo # acessando um atributo
self.metodo() # chamando um método
Por exemplo, no seguinte código para a classe Person
class Person:
def __init__(self, name, age):
self.name = name # nome da pessoa
self.age = age # idade da pessoa
def display_info(self):
print(f"Name: {self.name@ Age: {self.age@")
tom = Person("Tom", 22)
tom.display_info() # Saída: Name: Tom Age: 22
bob = Person("Bob", 43)
bob.display_info() # Saída: Name: Bob Age: 43
Aqui, o método display_info()
self
self.name
self.age
O resultado será:
Name: Tom Age: 22 Name: Bob Age: 43
Destrutores
Além dos construtores, as classes em Python podem ter métodos especiais chamados destrutores, que são chamados ao deletar um objeto. O destrutor é definido com o método __del__(self)
O destrutor é chamado automaticamente pelo interpretador, e não precisamos chamá-lo manualmente. Aqui está um exemplo simples:
class Person:
def __init__(self, name):
self.name = name
print("Criada pessoa com o nome", self.name)
def __del__(self):
print("Removida pessoa com o nome", self.name)
tom = Person("Tom")
Neste exemplo, o destrutor exibe uma mensagem ao remover o objeto Person
tom
Criada pessoa com o nome Tom Removida pessoa com o nome Tom
Outro exemplo:
class Person:
def __init__(self, name):
self.name = name
print("Criada pessoa com o nome", self.name)
def __del__(self):
print("Removida pessoa com o nome", self.name)
def create_person():
tom = Person("Tom")
create_person()
print("Fim do programa")
Aqui, o objeto Person
create_person
Person
Criada pessoa com o nome Tom Removida pessoa com o nome Tom Fim do programa