Dominando Objetos e Classes em Python: Guia Prático
Objetos e Classes em Python
Este tutorial explora recursos orientados a objetos centrais do Python, guiando você através de criação de classes, instanciação e boas práticas para código robusto.
Vídeo: Classes e Objetos em Python
Objetos e Classes em Python
Python é fundamentalmente orientado a objetos. Enquanto programação procedural foca em funções, POO centra em objetos que agrupam dados e comportamento.
Um objeto é pacote de atributos (dados) e métodos (funções). Uma classe é blueprint que define estrutura de um objeto.
Pense em classe como planta de casa — detalhando quartos, portas, janelas. Cada casa construída é objeto, ou instância, criada a partir da planta.
Múltiplos objetos podem ser construídos da mesma classe. Instanciação é processo de criar objeto a partir de classe.
Definindo Classe em Python
Definições de classe começam com palavra-chave class, espelhando como funções começam com def. Primeira string em classe é docstring, fornecendo descrição concisa.
class MyNewClass:
'''This is a docstring. I have created a new class'''
pass
Definir classe estabelece novo namespace para seus atributos, que podem ser dados ou métodos. Atributos especiais começando com underscores duplos, como __doc__, guardam metadados como docstring.
Uma vez definida, objeto classe é criado e pode ser usado para acessar atributos ou instanciar novos objetos.
class Person:
"This is a person class"
age = 10
def greet(self):
print('Hello')
# Saída: 10
print(Person.age)
# Saída: <function Person.greet>
print(Person.greet)
# Saída: "This is a person class"
print(Person.__doc__)
Saída
10 <function Person.greet at 0x7fc78c6e8160> This is a person class
Criando Objeto em Python
Classes servem como fábricas de objetos. Instanciação se assemelha a chamada de função:
>>> harry = Person()
Objeto resultante harry pode acessar atributos de classe via notação de ponto. Métodos de classe tornam-se bound methods na instância.
class Person:
"This is a person class"
age = 10
def greet(self):
print('Hello')
# criar novo objeto da classe Person
harry = Person()
# Saída: <function Person.greet>
print(Person.greet)
# Saída: <bound method Person.greet of <__main__.Person object>>
print(harry.greet)
# Chamar método greet() do objeto
# Saída: Hello
harry.greet()
Saída
<function Person.greet at 0x7fd288e4e160> <bound method Person.greet of <__main__.Person object at 0x7fd288e9fa30>> Hello
Note parâmetro self em definições de método. Quando método chamado em instância, Python passa automaticamente instância como primeiro argumento, permitindo harry.greet() executar sem fornecer self explicitamente.
Por convenção, self é usado, embora qualquer nome seja sintaticamente válido. Seguir convenção melhora legibilidade e alinha com padrões da comunidade.
Construtores em Python
Métodos especiais prefixados com underscores duplos desempenham papéis especiais. Método __init__, invocado na instanciação, atua como construtor, inicializando estado da instância.
class ComplexNumber:
def __init__(self, r=0, i=0):
self.real = r
self.imag = i
def get_data(self):
print(f'{self.real}+{self.imag}j')
# Criar novo objeto ComplexNumber
num1 = ComplexNumber(2, 3)
# Chamar método get_data()
# Saída: 2+3j
num1.get_data()
# Criar outro objeto ComplexNumber
# e adicionar atributo dinâmico 'attr'
num2 = ComplexNumber(5)
num2.attr = 10
# Saída: (5, 0, 10)
print((num2.real, num2.imag, num2.attr))
# Acessar atributo ausente levanta erro
print(num1.attr)
Saída
2+3j (5, 0, 10) Traceback (most recent call last): File "<string>", line 27, in <module> print(num1.attr) AttributeError: 'ComplexNumber' object has no attribute 'attr'
Este exemplo demonstra que atributos podem ser adicionados dinamicamente a instâncias individuais sem afetar outras.
Deletando Atributos e Objetos
Atributos podem ser removidos com statement del. Deletar método ou atributo de classe afeta chamadas subsequentes.
>>> num1 = ComplexNumber(2,3)
>>> del num1.imag
>>> num1.get_data()
Traceback (most recent call last):
... AttributeError: 'ComplexNumber' object has no attribute 'imag'
>>> del ComplexNumber.get_data
>>> num1.get_data()
Traceback (most recent call last):
... AttributeError: 'ComplexNumber' object has no attribute 'get_data'
Objetos em si podem ser deletados. Remover referência libera nome; se nenhuma outra referência existe, objeto é garbage-collected automaticamente.
>>> c1 = ComplexNumber(1,3)
>>> del c1
>>> c1
Traceback (most recent call last):
... NameError: name 'c1' is not defined
Em Python, gerenciamento de memória é feito por reference counting e garbage collector cíclico, garantindo limpeza eficiente de recursos.

python
- Classes e Objetos em C#: Fundamentos para POO Robusta
- Dominando Classes e Métodos Abstratos em C#: Guia Prático
- Entendendo Classes e Métodos Parciais em C#
- Dominando Classes e Métodos Sealed em C#: Quando Usar, Exemplos Claros e Segurança de Código
- Classes e Objetos em C++: Guia Prático de Programação Orientada a Objetos
- Funções Amigas e Classes Amigas em C++: Dominando o Controle de Acesso
- Palavras-chave e Identificadores em Python: Dominando Palavras Reservadas e Convenções de Nomenclatura
- Declarações, Indentação e Comentários em Python: Guia Claro
- Dominando Operações com Diretórios e Arquivos em Python
- Dominando Exceções Customizadas em Python: Guia Prático