# Tutorial sobre o método estático Python: sintaxe e utilização

É possível aceder aos métodos estáticos utilizando diretamente o nome da classe, sem necessidade de criar uma instância da classe. A função static method do Python promove, portanto, uma separação clara entre a lógica da classe e os dados da instância.

## Para que serve o método estático Python?

O método estático Python é uma função e um decorador utilizado para identificar métodos que operam independentemente das instâncias da classe. Os decoradores em Python são funções que modificam o comportamento de outros métodos, adicionando funcionalidades antes ou depois da sua execução, sem influenciar o próprio código da função. Ao contrário dos métodos de instância, as funções estáticas **não requerem um parâmetro implícito** como `self` para as instâncias.

Este método do Python oferece uma maneira específica de organizar funções dentro de classes que não precisam aceder a dados de instância. Como não estão vinculadas a uma instância, elas não podem **modificar o estado de um objeto**. São ferramentas úteis dentro da classe, pois servem para realizar tarefas gerais ou fornecer funcionalidades globais. Por exemplo, elas podem conter utilitários, rotinas de conversão ou funções gerais de ajuda que podem ser acessadas sem dados de instância.

## Qual é a sintaxe do método estático Python?

Existem duas formas de criar métodos estáticos em Python: utilizar a função `staticmethod()` ou o decorador `@staticmethod`.

### `staticmethod()`

Python `staticmethod()` é uma função incorporada que converte um método de uma classe em **estático**. O valor de retorno da função staticmethod() é um método estático para a função que é passada como argumento. É escrito da seguinte forma:

```python
class clase:
    def staticmethodFunc(x,y):
        return x + y
Class.staticmethodFunc = staticmethod(Class.staticmethodFunc)
print('Sum = ', Class.staticmethodFunc(5,7)) # Output: Sum = 12
```

Ao passar a função `staticmethodFunc()`, definida na classe `Class`, **como argumento** para `staticmethod()`, pode aceder ao seu próprio método diretamente através do nome da classe.

### `@staticmethod`

O decorador `@staticmethod` é um método mais curto e comum para marcar uma função como estática. O decorador é colocado acima do método **na definição da classe**. Esta é a sua sintaxe:

```python
class Class:
    @staticmethod
    def staticmethodFunc(x, y):
        return x + y
print('Sum = ', Class.staticmethodFunc(5,7)) # Output: Sum = 12
```

O decorador `@staticmethod` indica ao **interpretador** que a função definida deve ser tratada como um método estático.

## Exemplos de código para usar o método estático Python

Pode utilizar métodos estáticos para diferentes tarefas. Veja os exemplos apresentados a seguir.

### Converter unidades

O método estático Python é muito útil para converter unidades.

```python
class Converter:
    @staticmethod
    def hoursToMinutes(hours):
        return hours * 60
    @staticmethod
    def minutesToHours(minutes):
        return minutes / 60
hours = 3
converted_minutes = Converter.hoursToMinutes(hours)
print(f"{hours} hours are {converted_minutes} minutes.") # Output: 3 hours are 180 minutes.
minutes = 180
converted_hours = Converter.minutesToHours(minutes)
print(f"{minutes} minutes are {converted_hours} hours.") # Output: 180 minutes are 3 hours.
```

Neste exemplo, a classe `Converter` tem dois métodos estáticos para converter entre horas e minutos. O método `hoursToMinutes()` converte horas em minutos, enquanto o `minutesToHours()` converte minutos em horas.

Os métodos estáticos são acedidos utilizando o nome da classe, sem necessidade de criar uma instância da classe. O acesso é feito diretamente através de `Converter.hoursToMinutes()` ou `Converter.minutesToHours()`, em que `Converter` é o nome da classe. O resultado é apresentado utilizando uma **f-string**, que é um método de formatação de cadeia ou Python string format que permite combinar expressões dentro de uma cadeia de texto.

### Funções de ajuda para realizar cálculos matemáticos

O método estático Python também pode ser utilizado para definir funções de ajuda para cálculos secundários da seguinte forma:

```python
class Calculator:
    @staticmethod
    def square(x):
        return x * x
    @staticmethod
    def sqroot(x):
        return x ** 0.5
num = 9
square = Calculator.square(num)
print(f"The square of {num} is {square}.") # Output: The square of 9 is 81.
root = Calculator.sqroot(num)
print(f"The square root of {num} is {root}.") # Output: The square root of 9 is 3.
```

O código de exemplo mostra a classe `Calculator` com métodos estáticos para calcular o quadrado e a raiz quadrada de um número. Através do decorador `@staticmethod`, `square()` (quadrado) e `sqroot()` (raiz quadrada) são marcados como métodos estáticos. Sem criar uma instância da classe, é possível aceder aos métodos através do nome da classe. Em seguida, o resultado de `Calculator.square()` e `Calculator.sqroot()` é concatenado numa f-string.

### Validar entradas

Outra utilização do método estático Python é a validação de entradas.

```python
class Validator:
    @staticmethod
    def isInteger(num):
        try:
            int(num)
            return True
        except ValueError:
            return False
    @staticmethod
    def isDecimal(num):
        try:
            float(num)
            return True
        except ValueError:
            return False
input = "123"
is_integer = Validator.isInteger(input)
print(f"Is '{input}' an integer? {is_integer}") # Output: Is '123' an integer? True
input = "3.14"
is_dec = Validator.isDecimal(input)
print(f"Is '{input}' a decimal number? {is_dec}") # Output: Is '3.14' a decimal number? True
```

A classe `Validator` compreende dois métodos estáticos: `isInteger()` e `isDecimal()`. Estas funções verificam se uma entrada dada é um número inteiro ou decimal. O método estático do Python `isInteger()` recebe uma entrada e tenta convertê-la em um número inteiro `(int(num))`. Se conseguir, retorna `True`. Caso contrário, obtém-se `False` se for capturada uma **exceção `ValueError`**, o que ocorre quando a validação não é possível.

O método `isDecimal()` é utilizado para converter a entrada num número decimal `(float(num))`. Se for bem-sucedido, é devolvido `True` e, caso contrário, `False`. Em seguida, são utilizados os métodos estáticos `isInteger()` e `isDecimal()` da classe `Validator` para verificar as entradas `"123"` e `"3.14"`. Os resultados são verdadeiros para ambas as funções.

### Manipular strings

```python
class StringManipulation:
    @staticmethod
    def reverseText(text):
        return text[::-1]
input_text = "Hello World!"
result = StringManipulation.reverseText(input_text)
print(f"Reversed text of '{input_text}': {result}") # Output: Reversed text of 'Hello World!': !dlroW olleH
```

Neste exemplo, define-se uma classe `StringManipulation` com um método estático `reverseText()`. Este método recebe um texto como parâmetro e utiliza a sintaxe de slicing `[::-1]` para inverter o texto `"Hello World!"` e devolver o resultado.


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