# Python classes: O que são e como usar classes em Python

Em Python, classes são estruturas fundamentais, pois funcionam como **esquemas ou matrizes** dessa linguagem de programação. Graças às classes de Python, programadores são capazes de escrever códigos reutilizáveis, que contém atributos e métodos.

## O que são classes em Python?

Na linguagem de programação Python, classes são interpretadas de forma **abstrata**, por terem o poder de definir os atributos e os métodos que um objeto pode ter. Classes em Python servem como modelos para a criação de objetos concretos, que nada mais são do que instâncias de uma classe. Por exemplo, ao criarmos uma classe fictícia chamada `carro`, podemos conferir atributos a ela, como cor e marca, além de métodos `__acelerar__` e `__frear__`.

Cada objeto de uma classe pode ter atributos com valores próprios, porém todos os objetos **compartilham os mesmos métodos e estruturas comportamentais das demais instâncias** da mesma classe. Detalhando ainda mais o nosso exemplo, dentro da classe `carro`, podemos estabelecer o objeto `meu_carro`, que tem a cor `__vermelha__` e a marca `__Toyota__`. Contudo, os métodos da classe `carro`, `__acelerar__` e `__frear__`, seguem sendo igualmente válidos a todos os objetos, ou seja, a todas as instâncias.

## Como criar classes em Python

Você pode definir classes em Python fazendo uso da palavra-chave `class`, como mostra o código a seguir:

```python
class MyClass:
    # Constructor method called when creating an object
    def __init__(self, attribute1, attribute2):
        self.attribute1 = attribute1
        self.attribute2 = attribute2
    
    # Method defined within the class
    def my_method(self):
        return f"Attribute 1: {self.attribute1}, Attribute 2: {self.attribute2}"
```

Nesse código escrito em Python, pensamos em gerar uma classe chamada `MyClass`. Adicionamos a ela um **construtor**, `__init__`, que é utilizado para a criação de um objeto e para a inicialização de dois atributos: `attribute1` e `attribute2`. O método `my_method`, por sua vez, é responsável por retornar uma cadeia de caracteres (*string*) formatada, contendo os valores desses atributos.

Para derivar um objeto a partir da classe que criamos, inserimos o nome da classe seguido de parênteses:

```python
object1 = MyClass("Value 1", "Value 2")
# Calling a method of the object
result = object1.my_method()
```

## Exemplos de uso de classes em Python

Em Python, classes são capazes de criar sistemas complexos e estabelecer relações entre as mais diferentes entidades. Observe, a seguir, situações variadas em que classes podem fazer a diferença, criando e modelando estruturas de forma mais organizada e reutilizável.

### Método `__str()__`

Dentro de classes em Python, o método `__str__()`, também conhecido como `dunder`, é considerado um método especial. Ele pode ser usado para definir uma **representação legível de um objeto** na forma de uma *string*. Você pode aplicar o método `__str()__` diretamente, passando uma instância da classe para a função `str()`, ou o combinando com a função `print()`. O exemplo abaixo explora as possibilidades:

```python
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def __str__(self):
        return f"Name: {self.name}, Age: {self.age}"
person1 = Person("Alice", 30)
print(person1) # Output: Name: Alice, Age: 30
```

No nosso código fictício, o método `__str__()` foi usado para criar, dentro da classe `Person`, uma ***string* formatada** contendo o nome e a idade de uma pessoa. Assim que a função `print(person1)` é inserida, ela chama automaticamente o método `__str__()` do objeto `person1`, para que a respectiva *string* seja retornada por esse método.

### Definir métodos de classes em Python

Na linguagem de programação Python, você também pode definir **métodos dentro de uma classe**, para que eles executem operações nos respectivos objetos. Esses métodos podem ser chamados pelos objetos criados, como mostra o código abaixo:

```python
class Rectangle:
    def __init__(self, length, width):
        self.length = length
        self.width = width
    
    def area(self):
        return self.length * self.width
    def perimeter(self):
        return 2 * (self.length + self.width)
# Creating an object of the class
my_rectangle = Rectangle(5, 10)
# Calling methods of the object
area = my_rectangle.area()
perimeter = my_rectangle.perimeter()
# Printing the calculated values
print("Area =", area) # Output: Area = 50
print("Perimeter =", perimeter) # Output: Perimeter = 30
```

Nesse código, desejamos criar a classe `Rectangle`, que deve conter dois métodos: `area()` e `perimeter()`. Esses métodos servem para calcular, respectivamente, a área e o perímetro do retângulo com base nos valores comprimento (*length*) e largura (*width*), que foram fornecidos na inicialização do objeto. Nesse método de classe em Python, `self` **faz referência ao objeto atual** ao qual o método está sendo aplicado.

Observe que, como resultado, o objeto `my_rectangle` é criado, medindo 5 de comprimento e 10 de largura. Em seguida, os métodos `area()` e `perimeter()` são aplicados a esse mesmo objeto, com o objetivo de calcular os demais valores.

### Alterar propriedades de objetos

O operador ponto `.` pode ser utilizado em Python para **acessar os atributos específicos de um objeto**, com o objetivo de atualizar os respectivos valores. Assim sendo, é possível atribuir novos valores a cada atributo de forma direta. O código abaixo comprova:

```python
person1.name = "Sarah"
person1.age = 35
```

Neste próximo exemplo, a palavra-chave `del` é usada para excluir as propriedades de um objeto:

```python
del person1.name
```

Nota Não confunda variáveis de instância com [variáveis de classe em Python](https://www.ionos.com/pt-br/digitalguide/sites-de-internet/desenvolvimento-web/python-class-variables/). Variáveis de classe são **definidas fora do construtor** e só podem ser alteradas por meio do nome da classe. Artigo especializado do nosso Digital Guide apresenta mais detalhes.


This is a markdown version of: [https://www.ionos.com/pt-br/digitalguide/sites-de-internet/desenvolvimento-web/python-classes/](https://www.ionos.com/pt-br/digitalguide/sites-de-internet/desenvolvimento-web/python-classes/) for AI/LLM consumption.