Prof. Natalia Castro Fernandes Engenharia de Telecomunicações – UFF 2º semestre/2012 Introdução Forma de programar Programação não estruturada 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) 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 tempo Estado modificado pela aplicação dos métodos Mudança de estados define comportamento do objeto 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 class nome: var = valor ... var = valor def 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 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ícios Crie uma classe que represente um carro. Essa classe deve ter pelo menos dois atributos (placa e cor) e pelo menos três métodos: seguir, virar_esquerda, virar_direita Crie uma classe motorista, que deve ter o método dirigir(carro, direção) Crie um script que faça um motorista, em posse de um carro, dirigir gerando 3 eventos consecutivos. O evento, que pode ser seguir em frente, virar à esquerda ou virar à direita, deve ser escolhido aleatoriamente. Os métodos de cada um dos objetos criados devem imprimir uma mensagem na tela toda vez que forem evocados. 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 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. 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 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 novos atributos Redefinição de método Atributo definido na classe pai Uso da função pela definição do pai e do filho 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 pai Cuidado ao sobrescrever indevidamente atributos 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 atributo, vale o atributo da classe declarada primeiro Exercício Crie uma calculadora, utilizando o esquema de classes a seguir. 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 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.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.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 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 nas matrizes de forma adequada.