SlideShare uma empresa Scribd logo
1 de 32
Baixar para ler offline
Python:
  Classes



Claudio Esperança
Orientação a Objetos
 É uma disciplina de programação assim como a
  Programação Estruturada
 Tenta unificar as idéias de algoritmos e estruturas de
  dados através do conceito de Objeto
      Um objeto é uma unidade de software que encapsula
       algoritmos e os dados sobre o qual os algoritmos atuam
 Os seguintes conceitos são importantes quando falamos
  de orientação a objetos:
      Polimorfismo
      Abstração
      Herança
Polimorfismo
 É o que permite que dois objetos diferentes possam ser
  usados de forma semelhante
      Por exemplo, tanto listas quanto tuplas ou strings podem
       ser indexadas por um número entre colchetes e suportam o
       método len
      Assim, se escrevemos ...
        for i in range(len(X)): print i
      ...não é possível saber de antemão se X é uma tupla, uma
       lista ou uma string
 Desta forma, se escrevemos um algoritmo para ser
  aplicado um objeto X, então também pode ser aplicado a
  um objeto Y desde que Y seja suficientemente polimórfico
  aX
Abstração (ou encapsulamento)
 É o que permite que um objeto seja utilizado sabendo-se
  sobre ele apenas a sua interface
      Em particular, não precisamos conhecer a implementação
       dos seus métodos
 Em OO a abstração tem mais alcance pois um objeto
  encapsula tanto dados como algoritmos
      Assim, podemos atribuir objetos ou passar objetos como
       argumentos, sem necessariamente saber como o objeto
       está implementado
Herança
 É o que permite construir objetos que são especializações
  de outro objeto
      Isso permite o reuso de software já que objetos
       especializados herdam dos objetos genéricos uma série de
       atributos comuns
 Por exemplo, considere um objeto que representa uma
  forma geométrica. Então, ele pode ter características tais
  como área, perímetro, centróide, etc.
      Um polígono é uma forma geométrica,
           Portanto, herda todas as características de formas
            geometricas
           Deve suportar também características específicas como
            número de lados e comprimento de arestas
Objetos em Python
 Python suporta OO através de classes
 Uma classe pode ser entendida como uma fábrica de
  objetos, todos com as mesmas características
      Diz-se que objeto fabricado por uma classe é uma instância
       da classe
 A rigor, uma classe é também um objeto
    Encapsula dados e algoritmos
    Entretanto, não é normalmente um objeto fabricado por
     uma classe, mas um objeto criado pela construção class
 Um objeto encapsula dados e algoritmos sob a forma de
  variáveis e métodos
      É comum chamar esses elementos constituintes dos
       objetos de atributos
Declaração de uma classe
 A maneira mais simples é:
     class nome:
        var = valor
             ...
             var = valor
             def metodo (self, ... arg):
                 ...
             def metodo (self, ... arg):
                ...
      As variáveis e os métodos são escritos precedidos pelo
       nome da classe e por um ponto (.)
           Assim, uma variavel v definida numa classe c é escrita c.v
      Os métodos sempre têm self como primeiro argumento
           self se refere a uma instância da classe
      Uma nova instância da classe é criada usando nome ()
Exemplo
>>> class C:
       a = 2
       b = 3
       def f(self,x):
          return C.a*x+C.b

>>>   C.a
2
>>>   C.b
3
>>>   obj=C()
>>>   obj.f(7)
17
Atributos de instâncias
 No exemplo anterior, a e b eram atributos da classe C e
  portanto usáveis por qualquer instância de C
 Mais freqüentemente, precisamos de atributos associados
  a instâncias individuais
 Um atributo attr associado a uma instância obj tem
  nome obj.attr
 Se queremos nos referir a um atributo attr de um objeto
  dentro de algum de seus métodos, usamos o nome
  self.attr
Exemplo
>>> class C:
       def init(self,a=2,b=3):
          self.a = a
          self.b = b
       def f(self,x):
          return self.a*x+self.b

>>>   obj1 = C()
>>>   obj1.init(2,3)
>>>   obj2 = C()
>>>   obj2.init(8,1)
>>>   obj1.f(7)
17
>>>   obj2.f(7)
57
Atributos herdados da classe
 Se uma classe define atributos de classe, as
  instâncias herdam esses atributos da classe como
  atributos de instância
 Ex.:
      >>> class C:
            a = 1
            def f(self,x):
               self.a += x

      >>>    c = C()
      >>>    c.f(2)
      >>>    c.a
      3
      >>>    C.a
      1
Construtores
 Um método como init do exemplo anterior é bastante útil
  para inicializar atributos da instância e é conhecido como
  construtor da classe
 Na verdade, Python suporta construtores que podem ser
  chamados automaticamente na criação de instâncias
      Basta definir na classe um método chamado __init__
      Este método é chamado automaticamente durante a
       criação de um nova instância da classe, sendo que os
       argumentos são passados entre parênteses após o nome
       da classe
 Obs.: o método __init__ é apenas um exemplo de
  “método mágico” que é invocado de maneira não padrão
  (veremos outros adiante)
Exemplo
>>> class C:
       def __init__(self,a=2,b=3):
          self.a = a
          self.b = b
       def f(self,x):
          return self.a*x+self.b


>>>   obj1 = C()
>>>   obj2 = C(8,1)
>>>   obj1.f(7)
17
>>>   obj2.f(7)
57
Especialização de classes
 Para fazer uma classe C herdar de outra B, basta declarar C
    como:
         class C(B):
             ...
   Diz-se que C é sub-classe (ou derivada) de B ou que B é
    super-classe (ou base) de C
   C herda todos os atributos de B
   A especialização de C se dá acrescentando-se novos atributos
    (variáveis e métodos) ou alterando-se métodos
   Se, ao escrever um método de C, precisamos invocar um
    método m de B, pode-se usar a notação B.m para diferenciar
    de m simplesmente, que se refere a C.m
Exemplo
>>> class B:
       n = 2
       def f(self,x): return B.n*x
>>> class C(B):
       def f(self,x): return B.f(self,x)**2
       def g(self,x): return self.f(x)+1
>>> b = B()
>>> c = C()
>>> b.f(3)
6
>>> c.f(3)
36
>>> c.g(3)
37
>>> B.n = 5
>>> c.f(3)
225
Construtores de classes derivadas
 O construtor de uma classe D derivada de C precisa
  chamar o construtor de C
      Permite inicializar os elementos de C não específicos a D
      Usa-se a notação C.__init__(self, ...)
Construtores de classes derivadas
 Exemplo:
>>>   class C:
...       def __init__(self):
...            self.x = 1
...
>>>   class D(C):
...       def __init__(self):
...           C.__init__(self)
...           self.y = 2
...
>>>   d=D()
>>>   d.x
1
>>>   d.y
2
Classes no “novo estilo”
 A partir do Python 2.2, classes podem também ser
  declaradas no chamado “novo estilo”:
      Se uma classe não é derivada de nenhuma outra, ela deve
       ser declarada como derivada da classe especial chamada
       object. Ex.:
          class C(object):
 Há várias diferenças entre o comportamento das classes
  no “novo estilo” e as do “velho estilo”
      Permite derivar tipos primitivos
      Descritores para propriedades, métodos estáticos, métodos
       de classe, etc
      Essas diferenças são pouco significativas para o iniciante
Herança múltipla
 É possível construir uma classe que herda de duas ou
  mais outras. Ex.:
      class C(A,B): ...
 Nesse caso, a classe derivada herda todos os atributos
  de ambas as classes-base
 Se ambas as classes base possuem um atributo com
  mesmo nome, aquela citada primeiro prevalece
      No exemplo acima, se A e B possuem um atributo x, então
       C.x se refere ao que foi herdado de A
Exemplo
>>> class C:
       def __init__(self,a,b):
           self.a, self.b = a,b
       def f(self,x):
           return self.a*x+self.b
>>> class D:
       def __init__(self,legenda):
           self.legenda = legenda
       def escreve(self,valor):
           print self.legenda,'=',valor
>>> class E(C,D):
       def __init__(self,legenda,a,b):
           C.__init__(self,a,b)
           D.__init__(self,legenda)
       def escreve(self,x):
           D.escreve(self,self.f(x))
>>> e = E("f",10,3)
>>> e.escreve(4)
f = 43
Atributos privados
 Em princípio, todos os atributos de um objeto podem ser
  acessados tanto dentro de métodos da classe como de
  fora
 Quando um determinado atributo deve ser acessado
  apenas para implementação da classe, ele não deveria
  ser acessível de fora
      Em princípio tais atributos não fazem parte da interface
       “pública” da classe
 Atributos assim são ditos privados
 Em Python, atributos privados têm nomes iniciados por
  dois caracteres “traço-embaixo”, isto é, __
Exemplo
>>> class   C:
      def   __init__(self,x): self.__x = x
      def   incr(self): self.__x += 1
      def   x(self): return self.__x

>>> a = C(5)
>>> a.x()
5
>>> a.incr()
>>> a.x()
6
>>> a.__x
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in -toplevel-
    a.__x
AttributeError: C instance has no attribute '__x'
Métodos mágicos
 São métodos que são invocados usando operadores
  sobre o objeto ao invés de por nome
 Já vimos um método desses: o construtor __init__
 Alguns outros são:
      Adição: __add__
           Chamado usando '+'
      Subtração: __sub__
           Chamado usando '-'
      Representação: __repr__
           Chamado quando objeto é impresso
      Conversão para string: __str__
           Chamado quando o objeto é argumento do construtor da
            classe str
           Se não especificado, a função __repr__ é usada
Exemplo
>>> class vetor:
      def __init__(self,x,y):
         self.x, self.y = x,y
      def __add__(self,v):
         return vetor(self.x+v.x, self.y+v.y)
      def __sub__(self,v):
         return vetor(self.x-v.x, self.y-v.y)
      def __repr__(self):
         return "vetor("+str(self.x)+","+str(self.y)+")"

>>> a=vetor(1,2)
>>> a += vetor(3,5)
>>> a-vetor(2,2)
vetor(2,5)
>>> print a
vetor(4,7)
Protocolos
 Diferentemente de outras linguagens, não há
  necessidade de classes serem relacionadas para haver
  polimorfismo entre elas, basta que implementem métodos
  semelhantes
 Um protocolo é uma especificação de polimorfismo
  informal
 Por exemplo, listas, strings e tuplas possuem em comum
  o fato de poderem iterar sobre uma coleção de elementos
      Todas implementam o protocolo para seqüências
      Métodos “mágicos” para indexar, alterar, etc.
Protocolo para seqüências
 __len__(self) retorna o comprimento da seqüência
    Chamada: len(objeto)
 __getitem__(self,key) retorna o elemento na
  posição key da seqüência
      Chamada: objeto[key]
      Deve-se implementar também chaves negativas!
 __setitem__(self,key,value)
    Chamada: objeto[key]=value
    Apenas para seqüências mutáveis
 __del__(self,key)
    Chamada por del objeto[key]
    Apenas para (algumas) seqüências mutáveis
Exemplo
>>> class ProgressaoAritmetica:
      def __init__(self,a1,incr):
           self.a1,self.incr=a1,incr
      def __getitem__(self,key):
           if not isinstance(key,(int,long)):
              raise TypeError
           if key<=0: raise IndexError
           return self.a1+(key-1)*self.incr
      def soma(self,n):
           return (self[1]+self[n])*n/2
>>> pa = ProgressaoAritmetica(1,2)
>>> pa[1]
1
>>> pa[10]
19
>>> pa.soma(100)
10000
Atributos, Getters e Setters
 Muitas vezes queremos que determinados atributos
  possam ser acessados de forma controlada, isto é,
  vigiados por métodos
 Os métodos que controlam o acesso a tais atributos são
  conhecidos como getters e setters , referindo-se a
  métodos de leitura e escrita, respectivamente
 Os atributos controlados são chamados de propriedades
 Na verdade, podemos ter propriedades abstratas que não
  correspondem 1 para 1 com atributos da classe
Exemplo
>>> class Retangulo:
      def __init__(self,tamanho):
         self.setTamanho(tamanho)
      def setTamanho(self,tamanho):
         if min(tamanho)<0: raise ValueError
         self.__tamx,self.__tamy = tamanho
      def getTamanho(self):
         return (self.__tamx,self.__tamy)

>>> r = Retangulo((20,30))
>>> r.getTamanho()
(20, 30)
>>> r.setTamanho((-1,0))

Traceback (most recent call last):
 ...
ValueError
A função property
 A função property pode ser usada para consubstanciar
  uma propriedade implementada por métodos de tal
  maneira que ela pareça um atributo da classe
 Ela é usada no corpo de uma declaração de classe com a
  forma:
   atributo = property(fget, fset, fdel, doc)
 ...onde
    fget, fset, fdel são métodos para ler, escrever e remover o
      atributo
    doc é uma docstring para o atributo
Exemplo
>>> class Retangulo:
      def __init__(self,tamanho):
         self.setTamanho(tamanho)
      def setTamanho(self,tamanho):
         if min(tamanho)<0: raise ValueError
         self.__tamx,self.__tamy = tamanho
      def getTamanho(self):
         return (self.__tamx,self.__tamy)
      tamanho = property(getTamanho,setTamanho)

>>> r = Retangulo((20,30))
>>> r.tamanho
(20, 30)
>>> r.tamanho = (30,30)
>>> r.tamanho
(30, 30)
Dicas para uso de OO
 Agrupe funções e dados que se referem a um mesmo
  problema
    Por exemplo, se uma função manipula uma variável global,
     é melhor que ambas sejam definidas numa classe como
     atributo e método
 Não permita promiscuidade entre classes e instâncias de
  classe
    Por exemplo, se há necessidade de um objeto manipular
     um atributo de outro, escreva um método com essa
     manipulação e chame o método
 Não escreva métodos extensos
    Em geral, um método deve ser simples e ser compreendido
     conceitualmente em alguns segundos

Mais conteúdo relacionado

Mais procurados (20)

Programação orientada a objetos - IV
Programação orientada a objetos - IVProgramação orientada a objetos - IV
Programação orientada a objetos - IV
 
POO - 13 - Arrays em Java
POO - 13 - Arrays em JavaPOO - 13 - Arrays em Java
POO - 13 - Arrays em Java
 
Java6
Java6Java6
Java6
 
Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java
 
Java8
Java8Java8
Java8
 
Curso Java Básico - Aula02
Curso Java Básico - Aula02Curso Java Básico - Aula02
Curso Java Básico - Aula02
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em Python
 
Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Curso Java Básico - Aula 03
Curso Java Básico - Aula 03
 
POO - 23 - Coleções da API do Java
POO -  23 - Coleções da API do Java POO -  23 - Coleções da API do Java
POO - 23 - Coleções da API do Java
 
Java - Visão geral e Exercícios
Java - Visão geral e ExercíciosJava - Visão geral e Exercícios
Java - Visão geral e Exercícios
 
Exercícios de programação orientado a objeto
Exercícios de programação orientado a objetoExercícios de programação orientado a objeto
Exercícios de programação orientado a objeto
 
Meta-programacao em python
Meta-programacao em pythonMeta-programacao em python
Meta-programacao em python
 
Aulas de estrutura de dados por Ayrton Yagami
Aulas de estrutura de dados por Ayrton YagamiAulas de estrutura de dados por Ayrton Yagami
Aulas de estrutura de dados por Ayrton Yagami
 
Aula05
Aula05Aula05
Aula05
 
Java5
Java5Java5
Java5
 
POO - 14 - Vetores
POO - 14 - VetoresPOO - 14 - Vetores
POO - 14 - Vetores
 
Curso Java Básico - Aula 04
Curso Java Básico - Aula 04Curso Java Básico - Aula 04
Curso Java Básico - Aula 04
 
Aprendizagem Automática
Aprendizagem AutomáticaAprendizagem Automática
Aprendizagem Automática
 
Estruturas
EstruturasEstruturas
Estruturas
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecas
 

Destaque

Tecnologias de informacion para los negocios s14
Tecnologias de informacion para los negocios s14Tecnologias de informacion para los negocios s14
Tecnologias de informacion para los negocios s14Maestros Online
 
Programando em python modulos
Programando em python   modulosProgramando em python   modulos
Programando em python modulossamuelthiago
 
Balada da União - Julho, Agosto, Setembro 2012
Balada da União - Julho, Agosto, Setembro 2012Balada da União - Julho, Agosto, Setembro 2012
Balada da União - Julho, Agosto, Setembro 2012Lili Nabais
 
Organizacion computacional s14
Organizacion computacional s14Organizacion computacional s14
Organizacion computacional s14Maestros Online
 
Auditoria y consultoria administrativa s14
Auditoria y consultoria administrativa s14Auditoria y consultoria administrativa s14
Auditoria y consultoria administrativa s14Maestros Online
 
Finanzas corporativas ss14
Finanzas corporativas ss14Finanzas corporativas ss14
Finanzas corporativas ss14Maestros Online
 
Teoria del derecho penal 13160
Teoria del derecho penal 13160Teoria del derecho penal 13160
Teoria del derecho penal 13160Maestros Online
 
Metodologia de la investigacion en proyectos
Metodologia de la investigacion en proyectosMetodologia de la investigacion en proyectos
Metodologia de la investigacion en proyectosMaestros Online
 
O mundo no bolso e o mercado na ponta dos dedos
O mundo no bolso e o mercado na ponta dos dedosO mundo no bolso e o mercado na ponta dos dedos
O mundo no bolso e o mercado na ponta dos dedosArthur de Castro Araujo
 
Modelacion de procesos de negocio aplus
Modelacion de procesos de negocio aplusModelacion de procesos de negocio aplus
Modelacion de procesos de negocio aplusMaestros Online
 
Proyecto integrador de administracion de tecnologias de informacion as09005
Proyecto integrador de administracion de tecnologias de informacion as09005Proyecto integrador de administracion de tecnologias de informacion as09005
Proyecto integrador de administracion de tecnologias de informacion as09005Maestros Online
 
Direccion y liderazgo 2013
Direccion y liderazgo 2013Direccion y liderazgo 2013
Direccion y liderazgo 2013Maestros Online
 
Matematicas i 09101 2013
Matematicas i 09101 2013Matematicas i 09101 2013
Matematicas i 09101 2013Maestros Online
 
Fundamentos de tecnologias de informacion
Fundamentos de tecnologias de informacionFundamentos de tecnologias de informacion
Fundamentos de tecnologias de informacionMaestros Online
 
Diseño interactivo aplus
Diseño interactivo aplusDiseño interactivo aplus
Diseño interactivo aplusMaestros Online
 

Destaque (20)

Tecnologias de informacion para los negocios s14
Tecnologias de informacion para los negocios s14Tecnologias de informacion para los negocios s14
Tecnologias de informacion para los negocios s14
 
Matematicas financieras
Matematicas financierasMatematicas financieras
Matematicas financieras
 
Programando em python modulos
Programando em python   modulosProgramando em python   modulos
Programando em python modulos
 
Balada da União - Julho, Agosto, Setembro 2012
Balada da União - Julho, Agosto, Setembro 2012Balada da União - Julho, Agosto, Setembro 2012
Balada da União - Julho, Agosto, Setembro 2012
 
Organizacion computacional s14
Organizacion computacional s14Organizacion computacional s14
Organizacion computacional s14
 
Sala de espera artigo
Sala de espera artigoSala de espera artigo
Sala de espera artigo
 
Auditoria y consultoria administrativa s14
Auditoria y consultoria administrativa s14Auditoria y consultoria administrativa s14
Auditoria y consultoria administrativa s14
 
Finanzas corporativas ss14
Finanzas corporativas ss14Finanzas corporativas ss14
Finanzas corporativas ss14
 
Teoria del derecho penal 13160
Teoria del derecho penal 13160Teoria del derecho penal 13160
Teoria del derecho penal 13160
 
Metodologia de la investigacion en proyectos
Metodologia de la investigacion en proyectosMetodologia de la investigacion en proyectos
Metodologia de la investigacion en proyectos
 
O mundo no bolso e o mercado na ponta dos dedos
O mundo no bolso e o mercado na ponta dos dedosO mundo no bolso e o mercado na ponta dos dedos
O mundo no bolso e o mercado na ponta dos dedos
 
Matematicas ii fe2012
Matematicas ii fe2012Matematicas ii fe2012
Matematicas ii fe2012
 
Modelacion de procesos de negocio aplus
Modelacion de procesos de negocio aplusModelacion de procesos de negocio aplus
Modelacion de procesos de negocio aplus
 
Proyecto integrador de administracion de tecnologias de informacion as09005
Proyecto integrador de administracion de tecnologias de informacion as09005Proyecto integrador de administracion de tecnologias de informacion as09005
Proyecto integrador de administracion de tecnologias de informacion as09005
 
Metologia pequisa
Metologia pequisaMetologia pequisa
Metologia pequisa
 
Direccion y liderazgo 2013
Direccion y liderazgo 2013Direccion y liderazgo 2013
Direccion y liderazgo 2013
 
Matematicas i 09101 2013
Matematicas i 09101 2013Matematicas i 09101 2013
Matematicas i 09101 2013
 
Fundamentos de tecnologias de informacion
Fundamentos de tecnologias de informacionFundamentos de tecnologias de informacion
Fundamentos de tecnologias de informacion
 
Diseño interactivo aplus
Diseño interactivo aplusDiseño interactivo aplus
Diseño interactivo aplus
 
Direccion y liderazgo
Direccion y liderazgoDireccion y liderazgo
Direccion y liderazgo
 

Semelhante a Programando em python classes

POO-FundamentosPOO.pdf
POO-FundamentosPOO.pdfPOO-FundamentosPOO.pdf
POO-FundamentosPOO.pdfFausto Ayres
 
http://www.dm.ufscar.br/~waldeck/curso/java/
http://www.dm.ufscar.br/~waldeck/curso/java/http://www.dm.ufscar.br/~waldeck/curso/java/
http://www.dm.ufscar.br/~waldeck/curso/java/Rodrigo Vieira
 
Linguagem de programação implementação de classes
Linguagem de programação   implementação de classesLinguagem de programação   implementação de classes
Linguagem de programação implementação de classesCarlos Melo
 
Linguagens Poo
Linguagens PooLinguagens Poo
Linguagens PooInfogenius
 
Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Saulo Arruda
 
Sistemas Distribuídos - Aula 04 - Revisão de Java
Sistemas Distribuídos - Aula 04 - Revisão de JavaSistemas Distribuídos - Aula 04 - Revisão de Java
Sistemas Distribuídos - Aula 04 - Revisão de JavaArthur Emanuel
 
Fundamentos da Programação PHP OO - Aula 2
Fundamentos da Programação PHP OO - Aula 2Fundamentos da Programação PHP OO - Aula 2
Fundamentos da Programação PHP OO - Aula 2Thyago Maia
 
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...Professor Samuel Ribeiro
 
Classes Anônimas, Internas e Coleções Java
Classes Anônimas, Internas e Coleções JavaClasses Anônimas, Internas e Coleções Java
Classes Anônimas, Internas e Coleções Javadanrleywillian1
 
07 construtores e finalize
07   construtores e finalize07   construtores e finalize
07 construtores e finalizeArtur Todeschini
 

Semelhante a Programando em python classes (20)

Programando em python - Classes
Programando em python -  ClassesProgramando em python -  Classes
Programando em python - Classes
 
Guia Rápido Java
Guia Rápido JavaGuia Rápido Java
Guia Rápido Java
 
Orientação a Objetos
Orientação a ObjetosOrientação a Objetos
Orientação a Objetos
 
3- POO
3- POO3- POO
3- POO
 
Poo
PooPoo
Poo
 
v
vv
v
 
POO-FundamentosPOO.pdf
POO-FundamentosPOO.pdfPOO-FundamentosPOO.pdf
POO-FundamentosPOO.pdf
 
http://www.dm.ufscar.br/~waldeck/curso/java/
http://www.dm.ufscar.br/~waldeck/curso/java/http://www.dm.ufscar.br/~waldeck/curso/java/
http://www.dm.ufscar.br/~waldeck/curso/java/
 
10 heranca
10   heranca10   heranca
10 heranca
 
Linguagem de programação implementação de classes
Linguagem de programação   implementação de classesLinguagem de programação   implementação de classes
Linguagem de programação implementação de classes
 
Linguagens Poo
Linguagens PooLinguagens Poo
Linguagens Poo
 
Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1
 
Sistemas Distribuídos - Aula 04 - Revisão de Java
Sistemas Distribuídos - Aula 04 - Revisão de JavaSistemas Distribuídos - Aula 04 - Revisão de Java
Sistemas Distribuídos - Aula 04 - Revisão de Java
 
Fundamentos da Programação PHP OO - Aula 2
Fundamentos da Programação PHP OO - Aula 2Fundamentos da Programação PHP OO - Aula 2
Fundamentos da Programação PHP OO - Aula 2
 
Curso Java Basico
Curso Java BasicoCurso Java Basico
Curso Java Basico
 
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...
Java básico - Módulo 08 - Introdução à programação orientada à objetos oo - c...
 
Classes Anônimas, Internas e Coleções Java
Classes Anônimas, Internas e Coleções JavaClasses Anônimas, Internas e Coleções Java
Classes Anônimas, Internas e Coleções Java
 
Pacotes e Encapsulamento
Pacotes e EncapsulamentoPacotes e Encapsulamento
Pacotes e Encapsulamento
 
Pacotes e Encapsulamento
Pacotes e EncapsulamentoPacotes e Encapsulamento
Pacotes e Encapsulamento
 
07 construtores e finalize
07   construtores e finalize07   construtores e finalize
07 construtores e finalize
 

Mais de samuelthiago

Interface grafica em_java_parte_v
Interface grafica em_java_parte_vInterface grafica em_java_parte_v
Interface grafica em_java_parte_vsamuelthiago
 
Interface grafica em_java_parte_iv
Interface grafica em_java_parte_ivInterface grafica em_java_parte_iv
Interface grafica em_java_parte_ivsamuelthiago
 
Interface grafica em_java_parte_iii
Interface grafica em_java_parte_iiiInterface grafica em_java_parte_iii
Interface grafica em_java_parte_iiisamuelthiago
 
Interface grafica em_java_parte_ii
Interface grafica em_java_parte_iiInterface grafica em_java_parte_ii
Interface grafica em_java_parte_iisamuelthiago
 
Interface grafica em_java_parte_i
Interface grafica em_java_parte_iInterface grafica em_java_parte_i
Interface grafica em_java_parte_isamuelthiago
 
Poo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iiPoo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iisamuelthiago
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_jsamuelthiago
 
Projeto calculadora em_java
Projeto calculadora em_javaProjeto calculadora em_java
Projeto calculadora em_javasamuelthiago
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_jsamuelthiago
 
01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)samuelthiago
 

Mais de samuelthiago (20)

Eclipse i (1)
Eclipse i (1)Eclipse i (1)
Eclipse i (1)
 
Html básico
Html básicoHtml básico
Html básico
 
Interface grafica em_java_parte_v
Interface grafica em_java_parte_vInterface grafica em_java_parte_v
Interface grafica em_java_parte_v
 
Interface grafica em_java_parte_iv
Interface grafica em_java_parte_ivInterface grafica em_java_parte_iv
Interface grafica em_java_parte_iv
 
Interface grafica em_java_parte_iii
Interface grafica em_java_parte_iiiInterface grafica em_java_parte_iii
Interface grafica em_java_parte_iii
 
Interface grafica em_java_parte_ii
Interface grafica em_java_parte_iiInterface grafica em_java_parte_ii
Interface grafica em_java_parte_ii
 
Interface grafica em_java_parte_i
Interface grafica em_java_parte_iInterface grafica em_java_parte_i
Interface grafica em_java_parte_i
 
Poo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iiPoo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_ii
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_j
 
Projeto calculadora em_java
Projeto calculadora em_javaProjeto calculadora em_java
Projeto calculadora em_java
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_j
 
01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)
 
Java 08
Java 08Java 08
Java 08
 
Java 06
Java 06Java 06
Java 06
 
Java 05
Java 05Java 05
Java 05
 
Java 04
Java 04Java 04
Java 04
 
Java 03
Java 03Java 03
Java 03
 
Java 02
Java 02Java 02
Java 02
 
Java 01
Java 01Java 01
Java 01
 
Pged 08
Pged 08Pged 08
Pged 08
 

Programando em python classes

  • 2. Orientação a Objetos  É uma disciplina de programação assim como a Programação Estruturada  Tenta unificar as idéias de algoritmos e estruturas de dados através do conceito de Objeto  Um objeto é uma unidade de software que encapsula algoritmos e os dados sobre o qual os algoritmos atuam  Os seguintes conceitos são importantes quando falamos de orientação a objetos:  Polimorfismo  Abstração  Herança
  • 3. Polimorfismo  É o que permite que dois objetos diferentes possam ser usados de forma semelhante  Por exemplo, tanto listas quanto tuplas ou strings podem ser indexadas por um número entre colchetes e suportam o método len  Assim, se escrevemos ... for i in range(len(X)): print i  ...não é possível saber de antemão se X é uma tupla, uma lista ou uma string  Desta forma, se escrevemos um algoritmo para ser aplicado um objeto X, então também pode ser aplicado a um objeto Y desde que Y seja suficientemente polimórfico aX
  • 4. Abstração (ou encapsulamento)  É o que permite que um objeto seja utilizado sabendo-se sobre ele apenas a sua interface  Em particular, não precisamos conhecer a implementação dos seus métodos  Em OO a abstração tem mais alcance pois um objeto encapsula tanto dados como algoritmos  Assim, podemos atribuir objetos ou passar objetos como argumentos, sem necessariamente saber como o objeto está implementado
  • 5. Herança  É o que permite construir objetos que são especializações de outro objeto  Isso permite o reuso de software já que objetos especializados herdam dos objetos genéricos uma série de atributos comuns  Por exemplo, considere um objeto que representa uma forma geométrica. Então, ele pode ter características tais como área, perímetro, centróide, etc.  Um polígono é uma forma geométrica,  Portanto, herda todas as características de formas geometricas  Deve suportar também características específicas como número de lados e comprimento de arestas
  • 6. Objetos em Python  Python suporta OO através de classes  Uma classe pode ser entendida como uma fábrica de objetos, todos com as mesmas características  Diz-se que objeto fabricado por uma classe é uma instância da classe  A rigor, uma classe é também um objeto  Encapsula dados e algoritmos  Entretanto, não é normalmente um objeto fabricado por uma classe, mas um objeto criado pela construção class  Um objeto encapsula dados e algoritmos sob a forma de variáveis e métodos  É comum chamar esses elementos constituintes dos objetos de atributos
  • 7. Declaração de uma classe  A maneira mais simples é: class nome: var = valor ... var = valor def metodo (self, ... arg): ... def metodo (self, ... arg): ...  As variáveis e os métodos são escritos precedidos pelo nome da classe e por um ponto (.)  Assim, uma variavel v definida numa classe c é escrita c.v  Os métodos sempre têm self como primeiro argumento  self se refere a uma instância da classe  Uma nova instância da classe é criada usando nome ()
  • 8. Exemplo >>> class C: a = 2 b = 3 def f(self,x): return C.a*x+C.b >>> C.a 2 >>> C.b 3 >>> obj=C() >>> obj.f(7) 17
  • 9. Atributos de instâncias  No exemplo anterior, a e b eram atributos da classe C e portanto usáveis por qualquer instância de C  Mais freqüentemente, precisamos de atributos associados a instâncias individuais  Um atributo attr associado a uma instância obj tem nome obj.attr  Se queremos nos referir a um atributo attr de um objeto dentro de algum de seus métodos, usamos o nome self.attr
  • 10. Exemplo >>> class C: def init(self,a=2,b=3): self.a = a self.b = b def f(self,x): return self.a*x+self.b >>> obj1 = C() >>> obj1.init(2,3) >>> obj2 = C() >>> obj2.init(8,1) >>> obj1.f(7) 17 >>> obj2.f(7) 57
  • 11. Atributos herdados da classe  Se uma classe define atributos de classe, as instâncias herdam esses atributos da classe como atributos de instância  Ex.: >>> class C: a = 1 def f(self,x): self.a += x >>> c = C() >>> c.f(2) >>> c.a 3 >>> C.a 1
  • 12. Construtores  Um método como init do exemplo anterior é bastante útil para inicializar atributos da instância e é conhecido como construtor da classe  Na verdade, Python suporta construtores que podem ser chamados automaticamente na criação de instâncias  Basta definir na classe um método chamado __init__  Este método é chamado automaticamente durante a criação de um nova instância da classe, sendo que os argumentos são passados entre parênteses após o nome da classe  Obs.: o método __init__ é apenas um exemplo de “método mágico” que é invocado de maneira não padrão (veremos outros adiante)
  • 13. Exemplo >>> class C: def __init__(self,a=2,b=3): self.a = a self.b = b def f(self,x): return self.a*x+self.b >>> obj1 = C() >>> obj2 = C(8,1) >>> obj1.f(7) 17 >>> obj2.f(7) 57
  • 14. Especialização de classes  Para fazer uma classe C herdar de outra B, basta declarar C como: class C(B): ...  Diz-se que C é sub-classe (ou derivada) de B ou que B é super-classe (ou base) de C  C herda todos os atributos de B  A especialização de C se dá acrescentando-se novos atributos (variáveis e métodos) ou alterando-se métodos  Se, ao escrever um método de C, precisamos invocar um método m de B, pode-se usar a notação B.m para diferenciar de m simplesmente, que se refere a C.m
  • 15. Exemplo >>> class B: n = 2 def f(self,x): return B.n*x >>> class C(B): def f(self,x): return B.f(self,x)**2 def g(self,x): return self.f(x)+1 >>> b = B() >>> c = C() >>> b.f(3) 6 >>> c.f(3) 36 >>> c.g(3) 37 >>> B.n = 5 >>> c.f(3) 225
  • 16. Construtores de classes derivadas  O construtor de uma classe D derivada de C precisa chamar o construtor de C  Permite inicializar os elementos de C não específicos a D  Usa-se a notação C.__init__(self, ...)
  • 17. Construtores de classes derivadas  Exemplo: >>> class C: ... def __init__(self): ... self.x = 1 ... >>> class D(C): ... def __init__(self): ... C.__init__(self) ... self.y = 2 ... >>> d=D() >>> d.x 1 >>> d.y 2
  • 18. Classes no “novo estilo”  A partir do Python 2.2, classes podem também ser declaradas no chamado “novo estilo”:  Se uma classe não é derivada de nenhuma outra, ela deve ser declarada como derivada da classe especial chamada object. Ex.: class C(object):  Há várias diferenças entre o comportamento das classes no “novo estilo” e as do “velho estilo”  Permite derivar tipos primitivos  Descritores para propriedades, métodos estáticos, métodos de classe, etc  Essas diferenças são pouco significativas para o iniciante
  • 19. Herança múltipla  É possível construir uma classe que herda de duas ou mais outras. Ex.:  class C(A,B): ...  Nesse caso, a classe derivada herda todos os atributos de ambas as classes-base  Se ambas as classes base possuem um atributo com mesmo nome, aquela citada primeiro prevalece  No exemplo acima, se A e B possuem um atributo x, então C.x se refere ao que foi herdado de A
  • 20. Exemplo >>> class C: def __init__(self,a,b): self.a, self.b = a,b def f(self,x): return self.a*x+self.b >>> class D: def __init__(self,legenda): self.legenda = legenda def escreve(self,valor): print self.legenda,'=',valor >>> class E(C,D): def __init__(self,legenda,a,b): C.__init__(self,a,b) D.__init__(self,legenda) def escreve(self,x): D.escreve(self,self.f(x)) >>> e = E("f",10,3) >>> e.escreve(4) f = 43
  • 21. Atributos privados  Em princípio, todos os atributos de um objeto podem ser acessados tanto dentro de métodos da classe como de fora  Quando um determinado atributo deve ser acessado apenas para implementação da classe, ele não deveria ser acessível de fora  Em princípio tais atributos não fazem parte da interface “pública” da classe  Atributos assim são ditos privados  Em Python, atributos privados têm nomes iniciados por dois caracteres “traço-embaixo”, isto é, __
  • 22. Exemplo >>> class C: def __init__(self,x): self.__x = x def incr(self): self.__x += 1 def x(self): return self.__x >>> a = C(5) >>> a.x() 5 >>> a.incr() >>> a.x() 6 >>> a.__x Traceback (most recent call last): File "<pyshell#13>", line 1, in -toplevel- a.__x AttributeError: C instance has no attribute '__x'
  • 23. Métodos mágicos  São métodos que são invocados usando operadores sobre o objeto ao invés de por nome  Já vimos um método desses: o construtor __init__  Alguns outros são:  Adição: __add__  Chamado usando '+'  Subtração: __sub__  Chamado usando '-'  Representação: __repr__  Chamado quando objeto é impresso  Conversão para string: __str__  Chamado quando o objeto é argumento do construtor da classe str  Se não especificado, a função __repr__ é usada
  • 24. Exemplo >>> class vetor: def __init__(self,x,y): self.x, self.y = x,y def __add__(self,v): return vetor(self.x+v.x, self.y+v.y) def __sub__(self,v): return vetor(self.x-v.x, self.y-v.y) def __repr__(self): return "vetor("+str(self.x)+","+str(self.y)+")" >>> a=vetor(1,2) >>> a += vetor(3,5) >>> a-vetor(2,2) vetor(2,5) >>> print a vetor(4,7)
  • 25. Protocolos  Diferentemente de outras linguagens, não há necessidade de classes serem relacionadas para haver polimorfismo entre elas, basta que implementem métodos semelhantes  Um protocolo é uma especificação de polimorfismo informal  Por exemplo, listas, strings e tuplas possuem em comum o fato de poderem iterar sobre uma coleção de elementos  Todas implementam o protocolo para seqüências  Métodos “mágicos” para indexar, alterar, etc.
  • 26. Protocolo para seqüências  __len__(self) retorna o comprimento da seqüência  Chamada: len(objeto)  __getitem__(self,key) retorna o elemento na posição key da seqüência  Chamada: objeto[key]  Deve-se implementar também chaves negativas!  __setitem__(self,key,value)  Chamada: objeto[key]=value  Apenas para seqüências mutáveis  __del__(self,key)  Chamada por del objeto[key]  Apenas para (algumas) seqüências mutáveis
  • 27. Exemplo >>> class ProgressaoAritmetica: def __init__(self,a1,incr): self.a1,self.incr=a1,incr def __getitem__(self,key): if not isinstance(key,(int,long)): raise TypeError if key<=0: raise IndexError return self.a1+(key-1)*self.incr def soma(self,n): return (self[1]+self[n])*n/2 >>> pa = ProgressaoAritmetica(1,2) >>> pa[1] 1 >>> pa[10] 19 >>> pa.soma(100) 10000
  • 28. Atributos, Getters e Setters  Muitas vezes queremos que determinados atributos possam ser acessados de forma controlada, isto é, vigiados por métodos  Os métodos que controlam o acesso a tais atributos são conhecidos como getters e setters , referindo-se a métodos de leitura e escrita, respectivamente  Os atributos controlados são chamados de propriedades  Na verdade, podemos ter propriedades abstratas que não correspondem 1 para 1 com atributos da classe
  • 29. Exemplo >>> class Retangulo: def __init__(self,tamanho): self.setTamanho(tamanho) def setTamanho(self,tamanho): if min(tamanho)<0: raise ValueError self.__tamx,self.__tamy = tamanho def getTamanho(self): return (self.__tamx,self.__tamy) >>> r = Retangulo((20,30)) >>> r.getTamanho() (20, 30) >>> r.setTamanho((-1,0)) Traceback (most recent call last): ... ValueError
  • 30. A função property  A função property pode ser usada para consubstanciar uma propriedade implementada por métodos de tal maneira que ela pareça um atributo da classe  Ela é usada no corpo de uma declaração de classe com a forma: atributo = property(fget, fset, fdel, doc)  ...onde  fget, fset, fdel são métodos para ler, escrever e remover o atributo  doc é uma docstring para o atributo
  • 31. Exemplo >>> class Retangulo: def __init__(self,tamanho): self.setTamanho(tamanho) def setTamanho(self,tamanho): if min(tamanho)<0: raise ValueError self.__tamx,self.__tamy = tamanho def getTamanho(self): return (self.__tamx,self.__tamy) tamanho = property(getTamanho,setTamanho) >>> r = Retangulo((20,30)) >>> r.tamanho (20, 30) >>> r.tamanho = (30,30) >>> r.tamanho (30, 30)
  • 32. Dicas para uso de OO  Agrupe funções e dados que se referem a um mesmo problema  Por exemplo, se uma função manipula uma variável global, é melhor que ambas sejam definidas numa classe como atributo e método  Não permita promiscuidade entre classes e instâncias de classe  Por exemplo, se há necessidade de um objeto manipular um atributo de outro, escreva um método com essa manipulação e chame o método  Não escreva métodos extensos  Em geral, um método deve ser simples e ser compreendido conceitualmente em alguns segundos