Skip to content

Commit 0465352

Browse files
authored
Merge pull request #301 from rg3915/pelican
Atualizando o post sobre Introdução a Classes e Métodos
2 parents 38d8c2c + 1c94d52 commit 0465352

File tree

1 file changed

+97
-10
lines changed

1 file changed

+97
-10
lines changed

content/introducao-classes-metodos-python-basico.rst

Lines changed: 97 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,15 @@ Introdução a Classes e Métodos em Python (básico)
1010
:github: rg3915
1111
:summary: Abordaremos aqui o básico sobre o uso de classes e métodos e a manipulação de dados em Python.
1212

13-
Eu não sou a melhor pessoa do mundo para explicar este assunto, mas eu escrevi este post para introduzir um tópico sobre *manipulação de banco de dados em SQLite3 com Python*, porém mais informações sobre classes e métodos podem ser encontradas nos links abaixo. Veja os exemplos em `https://github.com/rg3915/pythonDesktopApp <https://github.com/rg3915/pythonDesktopApp/tree/master/pythonBasico>`_.
13+
Eu não sou a melhor pessoa do mundo para explicar este assunto, mas vou tentar fazer uma breve introdução a classes e métodos em Python.
14+
15+
Mais informações sobre classes e métodos podem ser encontradas nos links abaixo. Veja os exemplos em `https://github.com/rg3915/python-classes-metodos <https://github.com/rg3915/python-classes-metodos/tree/master/pythonBasico>`_.
16+
17+
> Este artigo foi atualizado em 26 de Maio de 2018.
1418

1519
PS: *Considere a sintaxe para Python 3*.
1620

17-
Segundo a documentação do `Python <https://docs.python.org/2/tutorial/classes.html#class-objects>`_ e o video `Python para Zumbis <https://www.youtube.com/watch?v=Zr_FiKbgRbU>`_, uma **classe** associa dados (**atributos**) e operações (**métodos**) numa só estrutura. Um **objeto** é uma variável cujo tipo é uma classe, ou seja, um **objeto é uma instância** de uma classe.
21+
Segundo a documentação do `Python <https://docs.python.org/3/tutorial/classes.html#class-objects>`_ e o video `Python para Zumbis <https://www.youtube.com/watch?v=Zr_FiKbgRbU>`_, uma **classe** associa dados (**atributos**) e operações (**métodos**) numa só estrutura. Um **objeto é uma instância** de uma classe. Ou seja, uma representação da classe. Por exemplo, Regis é uma instância de uma classe chamada Pessoa, mas a Pessoa é a classe que o representa de uma forma genérica. Se você criar um outro ojbeto chamado Fabio, esse objeto também será uma instancia da classe Pessoa.
1822

1923
Na sua sintaxe mais elementar definimos uma classe conforme abaixo:
2024

@@ -43,16 +47,14 @@ Juntando os dois temos:
4347
.. code-block:: python
4448
4549
class NomeDaClasse(object):
46-
atributo1 = None
4750
4851
def metodo(self, args):
49-
pass
52+
pass
5053
5154
5255
5356
A primeira pergunta que você vai ter é o porque do ``self`` em ``metodo``. A resposta curta é, todo metodo criado dentro de uma classe deve definir como primeiro parametro o ``self``. Para a resposta longa, por favor, leia a excelente explicação que o Pedro Werneck fez: `O porquê do self explícito em Python <http://archive.is/cX2mq>`_
5457

55-
5658
A segunda pergunta é: para que serve o ``pass``?
5759

5860
A resposta é que, em Python, ao contrario de várias outras liguagens de programação, os blocos de código **NÃO** são definidos com os caracteres ``{`` e ``}``, mas sim com indentação e o caractere ``:``. Devido a esse fato, python necessitava de algo para explicitar quando se quer definir um bloco vazio. O ``pass`` foi criado exatamente para explicitar essa situação.
@@ -62,17 +64,42 @@ Um exemplo de uma função vazia feita em linguagem C e a mesma função vazia f
6264
.. code-block:: C
6365
6466
void metodo(int num){
65-
67+
6668
}
6769
6870
.. code-block:: python
6971
7072
def metodo(num):
7173
pass
7274
73-
Voltando a explicação sobre a classe: O ``atributo1`` é um atributo com valor inicial ``None`` (nada). Poderia ser ``atributo1 = 0``, por exemplo.
75+
Importante: Note que para nome de **classes** usamos *PalavrasComeçandoPorMaiúscula* (isso tambem é conhecido como "`CapitalizeWords <http://pep8.org/#descriptive-naming-styles>`_") e para nome de **métodos (funções)** usamos *minúsculas_separadas_por_underscore*. Esta é uma convenção adotada pelos *Pythonistas* segundo o `Guia de Estilo <http://www.python.org.br/wiki/GuiaDeEstilo>`_ **PEP 8** - `Style Guide for Python Code <http://legacy.python.org/dev/peps/pep-0008/>`_ escrito por `Guido Van Rossum <http://www.python.org.br/wiki/GuidoVanRossum>`_.
76+
77+
78+
Exemplo 0 - Pessoa
79+
------------------
80+
81+
No exemplo mencionado no começo desse post o código mais simples seria o seguinte:
82+
83+
.. code-block:: python
84+
85+
class Pessoa(object):
86+
87+
def __init__(self, nome):
88+
self.nome = nome
89+
90+
def __str__(self):
91+
return self.nome
92+
93+
94+
regis = Pessoa('Regis')
95+
print(regis)
96+
fabio = Pessoa('Fabio')
97+
print(fabio)
98+
99+
Note que ``regis`` é uma instância da classe ``Pessoa``, e ``fabio`` é uma outra instância. Ou seja, temos dois **objetos**: ``regis`` e ``fabio``.
100+
101+
Os dois métodos serão explicados no próximo exemplo.
74102

75-
Importante: Note que para nome de **classes** usamos *PalavrasComeçandoPorMaiúscula* (isso tambem é conhecido como "CamelCase") e para nome de **métodos (funções)** usamos *minúsculas_separadas_por_underscore*. Esta é uma convenção adotada pelos *Pythonistas* segundo o `Guia de Estilo <http://www.python.org.br/wiki/GuiaDeEstilo>`_ **PEP 8** - `Style Guide for Python Code <http://legacy.python.org/dev/peps/pep-0008/>`_ escrito por `Guido Van Rossum <http://www.python.org.br/wiki/GuidoVanRossum>`_.
76103

77104
Exemplo 1 - Calculadora simples
78105
-------------------------------
@@ -187,16 +214,21 @@ Usando o **terminal no modo interativo** façamos:
187214
>>> from calculadora2 import Calculadora
188215
>>> c = Calculadora()
189216
>>> print('Soma:', c.soma(2,3))
217+
Soma: 5
190218
>>> print('Subtração:', c.subtrai(2,10))
219+
Subtração: -8
191220
>>> print('Multiplicação:', c.multiplica(3,3))
221+
Multiplicação: 9
192222
>>> print('Divisão:', c.divide(128,2))
223+
Divisão: 64.0
224+
>>>
193225
194226
A vantagem de colocar os parâmetros em cada método, é que podemos calcular qualquer valor sem ter que instanciar uma nova classe para cada valor diferente.
195227

196228
Exemplo 3 - Classe Pedido
197229
-------------------------
198230

199-
Agora veremos um exemplo que mais se aproxima do que iremos fazer em banco de dados, mas aqui iremos apenas instanciar os objetos e armazená-los em memória numa lista.
231+
Agora veremos um outro exemplo, mas aqui iremos apenas instanciar os objetos e armazená-los em memória numa lista.
200232

201233
Veremos o código na íntegra e depois os comentários.
202234

@@ -246,6 +278,9 @@ Podemos rodar o Python no modo `modo interativo <https://docs.python.org/3/tutor
246278
>>> u2 = User('Fabio',20)
247279
>>> u2.save()
248280
>>> print(User.all())
281+
[<User: 1 - Regis - 35>
282+
, <User: 2 - Fabio - 20>
283+
]
249284
250285
Agora os comentários:
251286

@@ -342,11 +377,63 @@ Note que nesse ``print`` a lista está vazia.
342377
343378
Após chamar o ``save`` para as duas instâncias elas são guardadas e o método ``User.all()`` retorna essa lista.
344379

380+
Exemplo 4 - Televisão
381+
---------------------
382+
383+
Escrevi mais um exemplo para fixar melhor o entendimento: `tv.py <https://github.com/rg3915/python-classes-metodos/blob/master/pythonBasico/tv/tv.py>`_.
384+
385+
.. code-block:: python
386+
387+
class Televisao():
388+
389+
def __init__(self):
390+
self.ligada = False
391+
self.canal = 2
392+
393+
def muda_canal_para_baixo(self):
394+
self.canal -= 1
395+
396+
def muda_canal_para_cima(self):
397+
self.canal += 1
398+
399+
if __name__ == '__main__':
400+
tv = Televisao()
401+
print('Canal inicial:', tv.canal)
402+
print('Ligada:', tv.ligada)
403+
404+
tv.ligada = True
405+
tv.canal = 5
406+
407+
print('Ligada:', tv.ligada)
408+
print('Canal inicial:', tv.canal)
409+
tv.muda_canal_para_cima()
410+
print('Canal +', tv.canal)
411+
tv.muda_canal_para_cima()
412+
print('Canal +', tv.canal)
413+
tv.muda_canal_para_baixo()
414+
print('Canal -', tv.canal)
415+
416+
Este programa está muito bem explicado no video `Python para Zumbis <https://www.youtube.com/watch?v=Zr_FiKbgRbU>`_.
417+
418+
A seguir o resultado do programa:
419+
420+
.. code-block:: python
421+
422+
$ python tv.py
423+
('Canal inicial:', 2)
424+
('Ligada:', False)
425+
('Ligada:', True)
426+
('Canal inicial:', 5)
427+
('Canal +', 6)
428+
('Canal +', 7)
429+
('Canal -', 6)
430+
431+
345432
Agradeço a colaboração de `Fabio Cerqueira <https://gist.github.com/fabiocerqueira/1b05352a26892dea6813>`_.
346433

347434
Veja os exemplos em `https://github.com/rg3915/pythonDesktopApp <https://github.com/rg3915/pythonDesktopApp/tree/master/pythonBasico>`_.
348435

349-
Mais informações em
436+
Mais informações em
350437

351438
`Classes Python <https://docs.python.org/2/tutorial/classes.html#class-objects>`_
352439

0 commit comments

Comments
 (0)