InFog

Um blog sobre GNU, Linux, Open Source, Desenvolvimento e Nerdices em Geral

Curso de Python – Aula 15 – Mais sobre Orientação à Objetos

Tags: ,

Olá alunos!

Na aula passada vimos um básico sobre orientação à objetos, infelizmente apenas alguns alunos continuam enviando as aulas… Pessoal, vocês não podem ter medo de resolver os problemas, mesmo que pareça muito difícil tentem, só assim se aprende mesmo. E caso tenham dúvidas procurem o fórum ou postem comentários aqui no blog. O importante é não desistir, OK?

Nesta aula veremos como “proteger” atributos de uma classe.Este é uma pergunta que foi feita pelo Gustavo em comentário na última aula. O Magnun deu uma breve explicação, também em comentário. Valeu Magnun!

Este tipo de proteção é chamada de “atributos privados” e é algo muito comum na orientação à objetos. neste caso os atributos ou métodos privados de uma classe podem ser alterados ou chamados somente por funções da própria classe. O problema é que o Python não exatamente oferece essa “privacidade”, mas existem convenções para isso, vejam no exemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Aluno:
    __doc__ = """
        Classe de estudo
    """

    # Todos os atributos são privados...
    __Nome = ''
    __Serie = 0
    __Notas = [0,0,0,0]
#
    def __init__(self, Nome, Serie):
        __doc__ = """
            Instancia da classe Aluno
            Parâmetros
            Nome: String com o nome do aluno
            Serie: Integer com a classe do aluno (1 a 9)
        """

        self.__Nome = Nome
        self.__Serie = Serie
#
    def pega_nome(self):
        __doc__ = """
            Esta função retorna uma string com o nome do aluno
        """

        return self.__Nome
#
    def define_nota(self, Semestre, Nota):
        __doc__ = """
            Esta função serve para definir uma nota para um aluno
            Parâmetros
            Semestre: Integer de 1 a 4
            Nota: Float de 0 a 10
        """

        self.__Notas[Semestre] = Nota
#
    def define_nome(self, Nome):
        __doc__ = """
            Função para "renomear" o aluno
        """

        self.__Nome = Nome
#
    def fecha_media(self):
        __doc__ = """
            Esta função função tira a média do aluno
            e returna um float
        """

        Notas = 0
        Media = 0
        i = 0
        while (i < 4):
            Notas += self.__Notas[i]
            i += 1
        Media = Notas / 4
        return Media
#
# Iniciando o programa
nome = str(raw_input("Nome do aluno: "))
serie = int(raw_input("Serie: "))
aluno = Aluno(Nome=nome, Serie=serie)
# A linha abaixo não vai alterar mais o nome do aluno
aluno.__Nome = "José Nascimento"
# Mas a linha abaixo altera
aluno.define_nome("João da Silva")
i = 0
while (i < 4):
    nota = float(raw_input("Digite a %sª nota: " % str(i+1)))
    aluno.define_nota(Semestre=i, Nota=nota)
    i += 1
print("O aluno %s terminou o ano com média %f" % (aluno.pega_nome(),aluno.fecha_media()))

Como vocês podem ver agora o atributo “Nome” é chamado de “__Nome“, com isso o Python evita que ele seja alterado fora da classe.

Propriedades

Também como dica do Magnun vou falar sobre as propriedades, que eu ainda não conhecia. Vamos ao exemplo!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Aluno:
    __doc__ = """
        Classe de estudo
    """

    # Todos os atributos são privados...
    __Nome = ''
    __Serie = 0
    __Notas = [0,0,0,0]
#
    def __init__(self, Nome, Serie):
        __doc__ = """
            Instancia da classe Aluno
            Parâmetros
            Nome: String com o nome do aluno
            Serie: Integer com a classe do aluno (1 a 9)
        """

        self.__Nome = Nome
        self.__Serie = Serie
#
    def pega_nome(self):
        __doc__ = """
            Esta função retorna uma string com o nome do aluno
        """

        return self.__Nome
#
    def define_nota(self, Semestre, Nota):
        __doc__ = """
            Esta função serve para definir uma nota para um aluno
            Parâmetros
            Semestre: Integer de 1 a 4
            Nota: Float de 0 a 10
        """

        self.__Notas[Semestre] = Nota
#
    def define_nome(self, Nome):
        __doc__ = """
            Função para "renomear" o aluno
        """

        self.__Nome = Nome
#
    def fecha_media(self):
        __doc__ = """
            Esta função função tira a média do aluno
            e returna um float
        """

        Notas = 0
        Media = 0
        i = 0
        while (i < 4):
            Notas += self.__Notas[i]
            i += 1
        Media = Notas / 4
        return Media
#
    def pega_dados(self):
        __doc__ = """
            Esta função retorna os dados do aluno, nome e série
        """

        return "Aluno: %s\nSérie: %i" % (self.__Nome, self.__Serie)
#
    dados = property(pega_dados)
# Iniciando o programa
nome = str(raw_input("Nome do aluno: "))
serie = int(raw_input("Serie: "))
aluno = Aluno(Nome=nome, Serie=serie)
# Mostrando os dados do aluno...
print(aluno.dados)
i = 0
while (i < 4):
    nota = float(raw_input("Digite a %sª nota: " % str(i+1)))
    aluno.define_nota(Semestre=i, Nota=nota)
    i += 1
print("O aluno %s terminou o ano com média %f" % (aluno.pega_nome(),aluno.fecha_media())

Vejam que a propriedade “dados” (linha 63) chama uma função, isso é muito útil, pois, neste caso, nos poupa chamar uma função. Na verdade as propriedades tem mais usabilidade do que apenas isso, então fica a dica de estudo para vocês.

Acho que na próxima aula já podemos ver um pouco de GTK, o que conhecemos sobre classes até agora já é o suficiente.

Lição de Casa!

O exercício de hoje vai fazer vocês pensarem bastante, lembram do exercício da última aula? Pois então, eu quero que vocês refaçam este exercício, mas desta vez com os atributos privados, vocês podem usar propriedades se quiserem, mas não são obrigados. Mas desta vez o programa deve ter um pequeno menu que pergunta o que o usuário quer fazer, as opções são: “opção 1: cadastrar aluno”, “opção 2: definir notas”, “opção 3: ver boletim”, “opção 4: ver lista de alunos”. Ou seja, vou poder cadastrar quantos alunos eu quiser com a opção 1. Na opção 2 o programa deve mostrar a lista de alunos e perguntar para qual que serão definidas as notas. Na opção a mesma coisa, mas ao escolher um aluno o boletim dele deverá ser exibido. E a opção 4 só mostra uma lista simples, com todos os alunos.

Boa sorte! Este está bem divertido heheh.

Outros textos que você pode gostar:

  1. Curso de Python – Aula 14 – Orientação à Objetos Olá alunos! Depois da pausa para o carnaval estamos...
  2. Curso de Python – Aula 17 – Mais sobre o PyGTK Olá alunos! hoje vamos continuar falando sobre PyGTK. Na aula...
  3. Curso de Python – Aula 6 – Um pouco mais sobre strings E aqui vamos nós para mais uma aula de...

Posts relacionados trazidos a você pelo Yet Another Related Posts Plugin.

Tags: ,

8 Comentários to “Curso de Python – Aula 15 – Mais sobre Orientação à Objetos”


  1. Henry
    on mar 8th, 2009
    @ 15:40

    “mas desta vez com os atributos provados*” *privados

    “aula já podemos ver um,* pouco de GTK” *”verum pouco de”

    Só dando uns toques, acabei de ler meio corrido.

    Valeu

    [Resposta]


  2. InFog
    on mar 8th, 2009
    @ 17:56

    Valeu Henry! Esse tipo de errinho é bem chato de encontrar heheh.

    InFog

    [Resposta]


  3. Henry
    on mar 8th, 2009
    @ 18:32

    http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:Python

    [Resposta]


  4. Eduardo Rolim
    on mar 8th, 2009
    @ 20:49

    Estou acompanhando suas aulas de Python há algum tempo e gostaria de lhe parabenizar pelo excelente material que você está disponibilizando e pela iniciativa de ajudar mais e mais pessoas a conhecerem essa linda linguagem.

    Eu já programo em Python há algum tempo e quando vi seu blog pela primeira vez no BRLinux fiquei bastante curioso para saber o andamento das aulas.

    Bem, felicidades !!

    [Resposta]


  5. Curso de Python « Planeta Livre
    on mar 8th, 2009
    @ 22:49

    [...] Curso de Python O blog Infog iniciou a alguns meses atrás um curso voltado à linguagem Python. Hoje saiu a aula de número 15, com o título “Mais sobre Orientação à Objetos”. [...]


  6. Diego
    on mar 9th, 2009
    @ 12:16

    Poderia disponibilizar em pdf ou odt, no caso eu encontrei seu curso ontem, pra achar os post ficar trabalhoso. poderia colocar uma aula anterior a que ta no site.
    Ex: ta na aula 15, disponibiliza até a aula 14 em um mesmo pdf, ae quando publicar a 16 adiciona a 15 no pdf.
    :D
    Só uma sugestão para facilitar.
    abraço

    [Resposta]


  7. Henry
    on mar 12th, 2009
    @ 10:38

    Olá, eu estou com uma dúvida… Não sei se estou certo, mas por exemplo você tenta definir “Nome” logo após o “class”… Você poderia simplesmente colocar dentro dos métodos: “self.Nome = nome” e o atributo Nome já seria formado…
    Bom, mas parece que quando você coloca o atributo “Nome” fora do método, ou seja, sem usar “self.Nome” esse atributo vira um atributo “estático”, ou seja, você não precisa definir um objeto para atribuir um valor ao atributo “Nome”… No caso, você poderia colocar: “Class.Atributo = valor”/ Aluno.Nome = “henry” (ñ é um objeto, só a classe)

    Eu estava lendo isso em algum lugar e lembrei que programar em Python é simples, o mais complicadinho é programar pensando Pythonicamente.. hehe, por exemplo, em C++ a gente tem de definir as variávis antes, no caso, essa definição fora do método.. o atributo nome por exemplo, me parece um vício de querer definir as variáveis no começo da classe etc, já que aparentemente os Objetos possuem um Nome, mas uma classe Aluno não tem pra que ter um Nome…

    Posso estar enganado quanto a isso!! hehe É que estou com preguiça de confirmar, pesquisar sobre, essa minha “dedução”…

    Valeu

    [Resposta]


  8. Rodrigo Cesar
    on mar 13th, 2009
    @ 23:58

    Ficou legal o blog com essa nova cara !
    Gostei .

    []’s

    [Resposta]

Deixar uma Resposta

© 2009 InFog. All Rights Reserved.

This blog is powered by Wordpress and Magatheme by Bryan Helmig.