# Variáveis de classe Python: como criar e usar variáveis de classe

As variáveis de classe em Python representam uma forma estruturada de partilhar dados entre diferentes instâncias de uma classe. Além disso, as **alterações numa variável de classe** afetam todas as instâncias da classe, pelo que não é necessário redefini-las sempre que são instanciadas.

## O que são variáveis de classe em Python?

As variáveis de classe em Python são criadas dentro de uma classe. Ao contrário das variáveis de instância, que são específicas para cada instância de uma classe, as **variáveis de classe mantêm o mesmo valor para todas as instâncias**. Como regra geral, essas variáveis são definidas antes do construtor e todas as instâncias da classe podem aceder a elas.

As variáveis de classe são frequentemente utilizadas para **armazenar informações** comuns a todas as instâncias de uma classe, como valores de configuração, valores padrão ou estados comuns dentro de uma hierarquia de classes. Também pode utilizar essas variáveis para definir métodos ou atributos de classe partilhados por todas as instâncias de uma classe, o que melhora a funcionalidade e a organização do código.

## Qual é a sintaxe das variáveis de classe em Python?

As variáveis de classe em Python são criadas **dentro da definição da classe**, mas fora de qualquer método dentro dessa classe.

```python
class Car:
    total_cars = 0  # Class variable to track the total number of cars
    def __init__(self, brand, model):
        self.brand = brand  # Instance variable for the car brand
        self.model = model  # Instance variable for the car model
        Car.total_cars += 1  # Increment the total number of cars upon each instantiation
    def display_details(self):
        print(f"Brand: {self.brand}, Model: {self.model}")
# Creating instances of Car
car1 = Car("BMW", "X3")
car2 = Car("Audi", "A4")
# Accessing class variable and instance variables
print(f"Total number of cars: {Car.total_cars}")  # Output: 2
car1.display_details()  # Output: Brand: BMW, Model: X3
car2.display_details()  # Output: Brand: Audi, Model: A4
```

Dentro da classe `Car` (carro), define-se a variável de classe `total_cars` para obter o número total de carros. Sempre que uma nova instância da classe é criada, o construtor `__init__` é chamado. Em cada instância, as **variáveis de instância** `brand` (marca) e `model` (modelo) são definidas, e a variável de classe `total_cars` (total de carros) é incrementada em 1 para refletir a adição de um novo carro ao total.

Além disso, no exemplo, o método `display_details()` é chamado para mostrar os detalhes de cada instância de carro. Para aceder à variável de classe `total_cars` e obter o número total de carros criados, deve-se usar uma f-string, que é um método de formatação de string, também chamado de Python string format.

## Exemplos de utilização das variáveis de classe em Python

Para lidar com variáveis de classe em Python de forma segura, é importante entender como aceder a elas, modificá-las e como elas interagem com a herança.

### Aceder a variáveis de classe

Pode aceder às variáveis de classe em Python utilizando o **nome da classe ou uma instância**, seguido de um ponto e do nome da variável.

```python
class MyClass:
    class_var = "This is a class variable"
# using class name to access class variable
print(MyClass.class_var)  # Output: This is a class variable
# using instance to access class variable
obj = MyClass()
print(obj.class_var)  # Output: This is a class variable
```

Ao programar em Python, pode aceder às variáveis de classe em diferentes locais:

- **Dentro do construtor** da classe, escrevendo a palavra-chave `self` ou o nome da classe.
- **Dentro dos métodos de instância** da mesma forma que no caso anterior, ou seja, utilizando `self` ou o nome da classe.
- **Fora da classe**, utilizando a referência ao objeto ou o nome da classe.

### Modificar variáveis de classe

É possível modificar as variáveis de classe em Python utilizando diretamente o nome da classe. No entanto, se uma variável de instância tiver o mesmo nome que uma variável de classe e tentar modificá-la através da instância, **será criada uma nova variável de instância** e a variável de classe permanecerá inalterada.

```python
class MyClass:
    class_var = "Original class variable"
obj = MyClass()
print(obj.class_var)  # Output: Original class variable
MyClass.class_var = "Modified class variable"
print(obj.class_var)  # Output: Modified class variable
```

Neste exemplo, sobrescrevemos a variável de classe `class_var` atribuindo-lhe um novo valor através da classe `MyClass`, e a instância `obj` é automaticamente atualizada para refletir essa alteração.

### Variáveis de classe e herança

Graças à herança, as classes derivadas podem **aceder às variáveis de classe da classe base** e utilizá-las sem ter de as redefinir.

```python
class BaseClass:
    base_var = "Base variable"
class DerivedClass(BaseClass):
    pass
print(DerivedClass.base_var)  # Output: Base variable
```

No exemplo anterior, é definida uma classe base `BaseClass` que contém a variável de classe `base_var`. A classe derivada `DerivedClass` herda da `BaseClass`. Graças à herança, `DerivedClass` pode aceder à variável de classe `base_var` da classe base e utilizá-la sem ter de a redefinir.


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