> For the complete documentation index, see [llms.txt](https://afsh4ck.gitbook.io/desarrollo-con-python/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://afsh4ck.gitbook.io/desarrollo-con-python/orientacion-a-objetos/metodos-y-atributos.md).

# Métodos y atributos

## <mark style="color:blue;">1. ¿Qué son los métodos?</mark>

La primera construcción que vamos a presentar que puede definirse dentro del cuerpo de la clase son las funciones. **Cuando una función forma parte de una clase se le denomina método**.

Todo lo que hemos visto sobre las funciones se aplica también a los métodos, la única diferencia práctica por ahora es la forma en que se invocan los métodos.

```python
class Coche:
    def velocidad_maxima():
        """Este método nos devuelve la velocidad máxima del coche"""
        print("Velocidad máxima:  ???")
        
coche1 = Coche()
```

## <mark style="color:blue;">2. Parámetro self</mark>

Cuando definimos métodos en una clase es necesario proporcionarles el parámetro `self`, que debe situarse en primer lugar antes de los otros parámetros. El parámetro `self` es una referencia a la propia clase, y se utiliza para poder acceder a diferentes componentes de la misma.

```python
class Coche:
    def velocidad_maxima(self):
        """Este método nos devuelve la velocidad máxima del coche"""
        print("Velocidad máxima:  ???")
```

## <mark style="color:blue;">3. Acceso a los métodos de una clase</mark>

Cuando instanciamos un objeto a partir de la clase, podemos acceder a los métodos con la siguiente sintaxis:

```python
<nombre_objeto>.<nombre_metodo>([<argumentos>])
```

```python
class Coche:
    def velocidad_maxima(self):
        """Este método nos devuelve la velocidad máxima del coche"""
        print("Velocidad máxima:  ???")
        
coche1 = Coche()

coche1.velocidad_maxima()
Velocidad máxima:  ???
```

## <mark style="color:blue;">4. Atributos</mark>

Otra de las cosas que podemos definir en una clase son variables. **Cuando se define una variable dentro de una clase se denomina atributo**.

A la hora de definir atributos en una clase, podemos definirlos de dos tipos: **Atributos de clase** y **Atributos de instancia**.

* Un **atributo de clase** es una variable que pertenece a la clase y va a estar compartida entre todos los objetos que se instancien a partir de esa clase. Podemos acceder al valor de estos atributos con la sintaxis:

```python
<nombre_objeto>.<nombre_atributo_clase>
```

```python
class Coche:
    atributo_clase = 150
    def velocidad_maxima(self):
        """Este método nos devuelve la velocidad máxima del coche"""
        print("Velocidad máxima:", self.atributo_clase)
        
renault = Coche()

renault.velocidad_maxima()
Velocidad máxima: 150

renault.atributo_clase
150

bmw = Coche()

bmw.velocidad_maxima()
Velocidad máxima: 150

bmw.atributo_clase
150
```

* Un **atributo de instancia** es una variable que pertenece a un objeto en particular y que solo puede ser accedida en el contexto de ese objeto. Estas variables deben definirse en un método especial denominado constructor y representado por la sintaxis `__init__()`. Podemos acceder al valor de estos atributos con la sintaxis:

```python
<nombre_objeto>.<nombre_atributo_instancia>
```

## <mark style="color:blue;">4. Método</mark> <mark style="color:blue;"></mark><mark style="color:blue;">`__init__()`</mark>

El método `__init__()` es un método especial que Python ejecuta automáticamente cada vez que creamos una nueva instancia basada en esa clase. Este método tiene dos guiones bajos iniciales y dos guiones bajos finales, una convención que ayuda a evitar que los nombres de métodos por defecto de Python entren en conflicto con los definidos por el usuario.

El método `__init__()` se denomina constructor de la clase debido a que asigna valores específicos del objeto que se esta instanciando.

```python
class Coche:
    def __init__(self, vel_max, consumo_medio):
        self.vel_max = vel_max
        self.con_medio = consumo_medio
    def velocidad_maxima(self):
        """Este método nos devuelve la velocidad máxima del coche"""
        print("Velocidad máxima:", self.vel_max)
    def consumo_medio(self):
        """Este método nos devuelve el consumo medio del coche"""
        print("Consumo medio:", self.con_medio)    
            
renault = Coche(200, 7)

renault.velocidad_maxima()
Velocidad máxima: 200

renault.consumo_medio()
Consumo medio: 7

bmw = Coche(250, 10)

bmw.velocidad_maxima()
Velocidad máxima: 250

bmw.consumo_medio()
Consumo medio: 10
```
