Click here to load reader

Prof. Natalia Castro Fernandes Mestrado em ...natalia/prog_avan/slide6.pdf · Prof. Natalia Castro Fernandes Mestrado em Telecomunicações –UFF 2º semestre/2012

  • View
    4

  • Download
    0

Embed Size (px)

Text of Prof. Natalia Castro Fernandes Mestrado em ...natalia/prog_avan/slide6.pdf · Prof. Natalia Castro...

  • Prof. Natalia Castro Fernandes

    Mestrado em Telecomunicações – UFF

    2º semestre/2012

  • Introdução� Forma de programar

    � Programação não estruturada� Programas simples e pequenos� Programas simples e pequenos

    � Ex: Cartões

    � Programação Estruturada (ou Modular)� Programas divididos em módulos

    � Módulos com estruturas de dados internas

  • Introdução

    � Programação Orientada à Objetos

    � Programas estruturados pelos dados e não pelas operações

    � Dados, chamados de classe, especificam as operações válidas

    � Módulos agrupados por dados e suas representações

    � Unifica as ideias de algoritmos e estruturas de dados através do conceito de Objeto

    Programas organizados pelo comportamento dos objetos e não como uma simples sequência de comando e chamadas desconectadas.

  • Classe� É a representação de um tipo abstrato de dados

    � Especifica:� Atributos

    � Métodos (funções)� Métodos (funções)

    � Define as propriedades e o comportamento dos conjuntos de objetos.

  • Objeto� É uma instância de uma classe

    � Identificado univocamente pelo seu nome

    � Possui estado, determinado pelo valor dos atributos ao longo do tempolongo do tempo

    � Estado modificado pela aplicação dos métodos� Mudança de estados define comportamento do objeto

  • Conceitos de Orientação a Objetos � Abstração

    � Encapsulamento

    � Hierarquia de classes e herança

    Polimorfismo � Polimorfismo

    � Construtores e destrutores

  • Abstração

    � Objeto pode ser utilizado conhecendo-se apenas a sua interfaceinterface� Detalhes de implementação são ignorados

    � Encapsulamento de dados e algoritmos� Definidos dentro do objeto, não havendo necessidade de

    serem expostos na interface do objeto

  • Encapsulamento� Forma de definição dos objetos

    � Classificação de atributos e métodos de acordo com o controle de acesso

    � Classe composta de várias seções� Classe composta de várias seções� Privada – Podem ser acessados apenas pelos métodos do

    objeto

    � Pública – Podem ser acessados por outros objetos

    � Protegida – Podem ser acessados por métodos definidos na classe ou nas classes derivadas

    Em Python, tudo é público, mas existem meios para usar o privado.Veja mais em: http://docs.python.org/tutorial/classes.html

  • Hierarquia de Classes e herança� Pode-se desenvolver uma hierarquia de classe

    � Criação de uma classe-raiz e diversas subclasses ou classes derivadas

    � As classes-raiz representam as tarefas mais � As classes-raiz representam as tarefas mais generalizadas

    � As subclasses representam tarefas mais específicas� Herdam as características das classes ascendentes

    Vantagem: Reaproveitamento de código!

  • Herança� Herança simples

    � Uma classe tem apenas um paiEnlace

    � Herança múltipla� Uma classe tem vários pais

    Sem fio Ethernet Óptico

  • Polimorfismo� Uma mesma função pode ser definida de forma diferente

    por uma família de classes� Comportamento definido pela definição do método em cada

    classe

    � Exemplos� Exemplos� Listas, tuplas e strings podem ser indexadas por um número

    entre colchetes e suportam o método len� Se usarmos len(x), podemos passar uma lista, uma tupla ou uma

    string sem modificações ou indicações no código

    � Redefinição de métodos de uma classe pai� A classe enlace pode ter um método trata_erro genérico

    � Esse método pode ser tratado de forma mais especifica dentro das classes filhas, que redefinem a função

  • Construtores e destrutores� São métodos especiais das classes

    � O construtor é ativado quando se instancia o objeto de uma classe� Faz as atribuições iniciais da classe� Tem o nome da classe

    � O destrutor da classe é ativado quando termina o escopo de um objeto� Faz as ações finais antes de o objeto ser eliminado

    � Quando não são declarados, o construtor apenas cria a área de memória necessária ao objeto e o destrutor a libera

  • Orientação a objetos em Python� Classe

    � “Fábrica” de objetos� A rigor, em Python, uma classe também é um objeto

    � Uso de módulo.método é uma forma de usar um módulo como um objeto. O mesmo se aplica às classes

    � Definição de uma classe� Definição de uma classeclass nome:

    var = valor...var = valordef metodo (self, ... arg):...def metodo (self, ... arg):...

  • Definição de classes� Na definição dos métodos, os atributos são chamados como

    nome_da_classe.atributo

    � O primeiro argumento de qualquer método é sempre self� O primeiro argumento de qualquer método é sempre self� O self é uma referência a própria instância da classe

    � É uma forma de a classe dizer que se refere a si mesma

    � Atributos da classe podem ser chamados também como self.atributo

    � Um objeto de uma classe é criado usando nome_da_classe()

  • Exemplos – Criação de classes

  • Exemplos – Criação de classes

  • Exemplos (o que não fazer)

  • Exemplos – Uso do self

  • Exemplos – Atributos internos e

    externos

  • Exemplos - Reescrevendo

    Atenção: o.extra() daria erro. Por que?

  • Exercício� Imagine que você está programando um site que deve

    vender pizza. A loja, o vendedor, o cliente, a pizza e o cardápio precisam ser representados. Crie as classes, com seus métodos (apenas imprimem o que deveriam com seus métodos (apenas imprimem o que deveriam fazer, mas recebem os argumentos corretos) e atributos.

  • Construtores em Python

    � Chamados automaticamente na criação de instâncias

    � Utilizados declarando-se um método __init__

  • Exemplo

  • Exemplo

  • Destrutores� A linguagem Python já apresenta um ‘coletor de lixo’

    � Gerenciamento de memória alocada feita de forma automática

    � Uso dos destrutores para:� Fechar sockets� Fechar sockets� Fechar conexões com banco de dados� Fechar arquivos� Etc;

    � Formato:� __del__

    � Destrutores são chamados após o fim do escopo no qual o objeto está inserido

  • Atenção: As mensagens do destrutor podem não aparecer

    no console que você está usando.

    (mensagens impressas apenas no sys.stderr )

    Se houver necessidade de criar logs, usar arquivos e colocar

    exit no final do código.

  • Exercício� Crie uma classe para lidar com strings que tenha um

    construtor e um destrutor. A classe pode ter tantos argumentos você achar necessário, mas deve ter pelo menos um método.menos um método.

  • Encapsulamento� Atributos públicos

    � Todos os atributos de uma classe, por padrão

    � Atributos privados� Atributos privados� Representados com __ na frente do nome

  • Exemplos

  • Exemplos

  • Exercício� Dois objetos de classes distintas, A e B, interagem da

    seguinte forma. Enquanto A não recebe um número primo do usuário, ele fica recebendo novos números. Quando recebe um número primo, ele ativa um atributo privado de B, de tal forma que B passa a pedir atributo privado de B, de tal forma que B passa a pedir números para o usuário até receber um número não primo. Quando número é recebido, B seta um atributo privado de A, de tal forma que A volta para a operação inicial.� Atenção: Utilize threads para representar o

    funcionamento das duas classes.

  • Herança e Polimorfismo� Para uma classe herdar atributos e métodos de outra,

    basta declarar isso na definição da classe� Formato: Class Filha(Classe_Pai):

    � Filha é uma sub-classe ou uma derivada de Classe_Pai e � Filha é uma sub-classe ou uma derivada de Classe_Pai e Classe_Pai é uma superclasse ou base de C

    � É possível adicionar novos métodos e atributos à classe Filha, assim como é possível modificar métodos da Classe_Pai.

  • Herança e Polimorfismo� Caso um método ou um atributo seja redefinido e seja

    necessário chamar esse método ou atributo da superclasse, colocar essa chamada de forma explicita

    � Construtores e destrutores da classe e da superclasse precisam ser chamados pelo construtor da nova classe

  • Declaração de herança

    Declaração de Declaração de novos atributos

    Atributo definido na classe pai

    Redefinição de método

    Uso da função pela definição do pai e do filho

  • Redefinição de Redefinição de atributo

    Uso de atributo do pai e do filho

  • Descomentando a linha pai.__init__(self)

  • Construtores e herança� O construtor da classe pai apenas atua sobre os

    atributos da classe filha� Os atributos do pai chamados como pai.atributo não

    serão impactados pelo construtor do paiserão impactados pelo construtor do pai� Cuidado ao sobrescrever indevidamente atributos

  • Classes sem herança� Classes que não herdam de outra classe do usuário

    podem ser definidas da seguinte forma:� class sem_pai(object):

    � Isso permite algumas propriedades especiais para a classe que não serão discutidas agora� Mais informações em:

    http://docs.python.org/release/2.2.3/whatsnew/sect-rellinks.html

  • Herança de múltiplas classes

    � Uma classe pode ter vários pais� Herda os atributos e métodos de todas as classes pais

    Se duas classes pais possuírem o mesmo método ou o mesmo � Se duas classes pais possuírem o mesmo método ou o mesmo atributo, vale o atributo da classe declarada primeiro

  • Exercício� Crie um conjunto de classes, utilizando o conceito de

    herança, para representar as pessoas que interagem entre si em uma empresa.

  • Módulo operador

    � Permite reescrever o uso de comparações de objetos, operações lógicas e matemáticas, operações de sequência e testes de tipo abstratosequência e testes de tipo abstrato

    � Com isso, é possível reescrever o que deve ser feito quando se deseja somar ou subtrair dois objetos, por exemplo

  • Módulo operador� Principais funções

    � operator.lt(a, b) ou operator.__lt__(a, b)

    � operator.le(a, b) ou operator.__le__(a, b)

    � operator.eq(a, b) ou operator.__eq__(a, b)� operator.eq(a, b) ou operator.__eq__(a, b)

    � operator.ne(a, b) ou operator.__ne__(a, b)

    � operator.ge(a, b) ou operator.__ge__(a, b)

    � operator.gt(a, b) ou operator.__gt__(a, b)

  • Módulo operador� Principais funções

    � operator.is_(a, b) = Return a is b� operator.abs(obj)

    � operator.__abs__(obj)

    operator.add(a, b)� operator.add(a, b)� operator.__add__(a, b)

    � operator.and_(a, b)� operator.__and__(a, b)

    � operator.div(a, b)� operator.__div__(a, b)

    � operator.mod(a, b)� operator.__mod__(a, b)

  • Módulo operador� Principais funções

    � operator.neg(obj)� operator.__neg__(obj)

    � operator.or_(a, b)� operator.__or__(a, b)� operator.__or__(a, b)

    � operator.pos(obj)� operator.__pos__(obj)

    � operator.pow(a, b)� operator.__pow__(a, b)

    � operator.concat(a, b)� operator.__concat__(a, b)

    � operator.contains(a, b)� operator.__contains__(a, b)

  • Módulo operador� operator.iadd(a, b)

    � operator.__iadd__(a, b)a = iadd(a, b)� a += b.

    � operator.iand(a, b)� operator.__iand__(a, b)

    � a &= b.

    � operator.iconcat(a, b)� operator.__iconcat__(a, b)

    � a += b for a and b sequences.

    � operator.idiv(a, b)� operator.__idiv__(a, b)

    � a /= b

  • Módulo operador� operator.imod(a, b)

    � operator.__imod__(a, b)� a%= b.

    � operator.imul(a, b)� operator.__imul__(a, b)

    � a *= b.

    � operator.ior(a, b)� operator.__ior__(a, b)

    � a |= b.

    � operator.ipow(a, b)� operator.__ipow__(a, b)

    � a **= b.

  • Módulo operador� Mais informações em:

    http://docs.python.org/library/operator.html

  • Exercício� Crie uma classe matriz que, com seu construtor, cria

    uma matriz m x n. Essa classe deve sobrescrever os métodos para adição, subtração, multiplicação e divisão, de tal forma que as operações sejam realizadas divisão, de tal forma que as operações sejam realizadas nas matrizes de forma adequada.

  • Outras redefinições...� __len__

    � Retorna o comprimento da sequencia

    � Chamada: len(objeto)

    � __del__� __del__� Chamada por del objeto[key]

    � Apenas para (algumas) sequencias mutáveis

  • Exercícios� Modifique a classe de matrizes criada no exercício

    anterior, adicionando um novo método. Esse novo método verifica se dentro da matriz atual existem todas as vogais. todas as vogais.

    � Adicione mais um método que verifica se a soma de todos os inteiros presentes na matriz é um número regular. Um número é dito regular se sua decomposição em fatores primos apresenta apenas potências de 2, 3 e 5. Faça uma função que verifique se um número é ou não regular.

  • Exercícios� Desenvolva, com orientação a objetos, um programa que implemente o

    “jogo da velha” usando uma matriz de inteiros (use o 0 para o O e o 1 para o X). O programa deve permitir o jogo entre dois jogadores. A cada jogada o programa deve exibir a configuração atual do jogo ( matriz). Faça um algoritmo da solução, que deve ser executado no fim de cada jogada. Faça também o método que recebe a posição da jogada e diz qual o jogador atual.jogada. Faça também o método que recebe a posição da jogada e diz qual o jogador atual.

    � Crie uma classe para lidar com números. Essa classe, entre os seus métodos, deve apresentar:� Um método que diz se um número é um capicua. Um número é capicua

    quando ele não muda se lido da esquerda para a direita ou da direita para a esquerda. Se o número for capicua, o método deve modificar o seu valor, somando 1.

    � Um método que converta um número da base 10 para qualquer base entre 2 e 9, inclusive.

  • Exercícios� Crie uma classe para lidar com grafos. Um grafo G = (V;A)

    consiste em:� um conjunto finito de vértices, V. � um conjunto finito de arestas ligando dois vértices, A. A sua classe deve ter:A sua classe deve ter:

    � um método para representar o grafo como uma lista de adjacências;� um outro método para representar o grafo como uma matriz de

    adjacências;� um método para determinar se dois vértices são vizinhos;� Um método para determinar a lista de todos os vértices que são vizinhos

    de um dado vértice� Um método para dizer a menor distância entre dois vértices quaisquer

    do grafo. Considere que cada vértice é representado por um número inteiro.

    Escreva um aplicativo para testar a classe.