{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "9e4bf383",
   "metadata": {},
   "source": [
    "# Uso do self nos métodos python"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "43f3f0c2-c83d-4ec2-bd60-a85a4de45208",
   "metadata": {
    "tags": []
   },
   "source": [
    "### Exemplo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "f57ea44f",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Pessoa(object):\n",
    "    def setNome(alguem, nome): #alguem é o parâmetro para o objeto\n",
    "        if len(nome) >= 2:\n",
    "            alguem.nome = nome"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "341bdc11",
   "metadata": {},
   "source": [
    "### Criando a instância (objeto) mulher"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "c78ff98b",
   "metadata": {},
   "outputs": [],
   "source": [
    "mulher=Pessoa()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6fbef66a",
   "metadata": {},
   "source": [
    "### Em *Pessoa.setNome* o primeiro parâmetro é *alguem*. Entretanto é padrão chamá-lo de *self*\n",
    "### Não é obrigatório, mas via de regra é melhor utilizar *self* como primeiro parâmetro dos métodos"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "44103c8e",
   "metadata": {},
   "source": [
    "## Nome da classe deve vir antes do uso da função, pois a função está dentro da classe.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "b2f29213",
   "metadata": {},
   "outputs": [],
   "source": [
    "Pessoa.setNome(mulher, 'Juliana')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5668b683",
   "metadata": {},
   "source": [
    "### Ficar chamando o nome da classe e passar o objeto como parâmetro é redundante. Deve ter um jeito melhor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "a809438d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Juliana\n"
     ]
    }
   ],
   "source": [
    "print(mulher.nome)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7d59bbc3",
   "metadata": {},
   "source": [
    "### Para chamar métodos, tanto faz chamá-los como em *Classe.metodo(objeto, parametros)* \n",
    "### quanto chamá-los como em *objeto.metodo(parametros)*\n",
    "#### Isto é tanto faz, *Pessoa.setNome(mulher,nome)* ou *mulher.setNome(nome)*"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f0ce0350",
   "metadata": {},
   "source": [
    "##### Chama o objeto antes da função e depois usa o objeto como parâmetro"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eb425636",
   "metadata": {},
   "source": [
    "#### *mulher.setNome(mulher, 'Juliana')* não tem sentido e dá pau"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9c65aaa3",
   "metadata": {},
   "source": [
    "### É melhor que o objeto chame o método "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "ac45721a",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Pessoa(object):\n",
    "    def setNome(self, nome): #self explícito é melhor que implícito, filosofia Python\n",
    "        if len(name) >= 2:\n",
    "            self.nome = nome\n",
    "      \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "340b04c1",
   "metadata": {},
   "outputs": [],
   "source": [
    "mulher = Pessoa()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c0a41929",
   "metadata": {},
   "source": [
    "### O objeto chama a função e dentro do método da classe está explícito o *self*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "ee64f1e3",
   "metadata": {},
   "outputs": [],
   "source": [
    "mulher.setNome('Maria')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "a516e094",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Maria\n"
     ]
    }
   ],
   "source": [
    "print(mulher.nome)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
