> 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
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://afsh4ck.gitbook.io/desarrollo-con-python/orientacion-a-objetos/metodos-y-atributos.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
