• Home »
  • Artigos »
  • Atributos e métodos em Python – Curso de Programação em Python

Atributos e métodos em Python – Curso de Programação em Python

Bem vindos á décima sétima aula do curso de programação em Python do INFOmoz

Este artigo faz parte do curso de programação em Python do INFOmoz. Para acessar outras aulas do curso, por favor visite o índice do curso de programação em Python

OBJETIVOS DA AULA

  • Conceito de atributos e métodos
  • Atributos criados dinamicamente
  • Construtores
  • Atributos especiais
  • Exemplos

Na aula passada criamos a nossa primeira classe em Python: A classe Cachorros, que não fazia quase nada! Mas o nosso objectivo é criar classes funcionais, capazes de criar objetos com alguma vida útil para o nosso programa. Ai entram os dois conceitos chave da aula de hoje: Atributos e métodos.Já na Introdução dissemos que objetos tinham uma determinada característica e propriedade. Como algumas características são comuns a vários objetos, é necessário declara-las na própria classe, assim, cada objeto(instância) criado a partir desta classe, também vai possuir a tal característica.Vamos refazer a nossa classe Cachorros adicionando agora algumas características tipicas de um cachorro(estas características são chamadas de atributos!):

class Cachorros:    nome=”Rex”    patas=4    cor=”Castanho”    alimento=”ossos”

Para já, que tal criarmos um galinheiro?

class Galinhas:    alimento=”milho”    patas=2

Agora as nossas classes já possuem atributos, podemos confirmar isso usando a função dir(), faca isso!Para consultar um atributo de uma classe, fazemos:

#ex:>>>Cachorros.nome‘Rex’

Podemos ainda adicionar um atributo a uma classe ja criada:

>>>Cachorros.idade=2#Usar atributos em instancias:>>>dog=Cachorros()>>>dog.nome‘Rex’#Ou ainda em expressões:>>>print ‘O nome do meu cachorro e %s’ %(dog.nome)#(Verifique o resultado)

Note que o nome imprimido não é o nome da instancia mas sim o atributo nome.

Métodos em Python

Métodos são funções criadas dentro de uma classe, que vão definir as propriedades(ações) dos objetos criados a partir desta classe. Geralmente os métodos estão ligados as instâncias da classe. Por exemplo para a classe Cachorros poderíamos ter os métodos correr e comer enquanto que para galinhas teríamos comer e voar, etc.Voltando um pouco para o ambiente escolar, vamos definir uma classe Circulos com um atributo, raio, e dois metodos: calcula_area e calcula_volume(volume do cilíndro cuja base é o círculo em questão). A classe Cirulos, como dissemos na introdução a classes, será a nossa fórmula para a criação de todos os círculos que tiverem um raio, e ainda poder se determinar a área e o volume da figura que tiver como base este círculo:

class Circulos    raio=3    def calcula_area(self):        self.area=3.14*self.raio**2        return self.area    def calcula_volume(self,altura):        self.volume=self.calcula_area()*altura        return self.volume

Agora vamos criar uma instância da classe Circulos:

>>>c=Circulos() >>>c.raio 3 >>>c.area Traceback (most recent call last): File “”, line 1, in c.area AttributeError: Circulos instance has no attribute ‘area’

Usando dir() podes verificar se este erro é verdadeiro.Para invocar o metodo calcula_area() fazemos:

>>>c.calcula_area()

E o argumento self?O argumento self é sempre o primeiro argumento de um método e serve para fazer referencia a própria instancia na qual o método se aplica. Note que ao fazer

self.area=3.14*(self.raio**2)

estamos na verdade fazendo:

>>>c.area=3.14*(c.raio**2)

Ou em outras palavras, self indica que a variável a ele associada é um atributo ou método da própria instância. Self não é uma palavra reservada, mas é usada por padrão e é bom que você não mude isso a não ser que o seu objetivo seja trazer problemas a quem vai ler seu código!Para o caso de calcula_volume(), só indicamos o segundo argumento, que se omitido gerará um erro:

>>>c.calcula_volume(3)

Atributos criados dinamicamente

Vamos agora ver um recurso muito interessante do Python, que é a possibilidade de se criar atributos dinamicamente para uma determinada instância, sem ter que declara-lo na criação da classe. Isso é muito importante, quando queremos criar atributos exclusivos para uma determinada instancia da mesma classe. Você já testou isso! Para ver, volte a usar a função dir() para a classe a instancia c, vera que ela já possui o atributo area, que não existe na classe Circulos!!!

Construtores( O metodo __init__())

As classes que criamos ate agora geram um pequeno problema: Se o objetivo da Classe Cachorros era servir de template para a criação de cachorrinhos, será que todos eles vão ter o nome ‘Rex’? Ou então porque a nossa classe Circulos só geram instâncias que calculam áreas e volumes para circunferências de raio 3???Para corrigir isso existe em Programação orientada a objetos o conceito de construtor. Construtores são métodos especiais que servem para inicializar os atributos de uma classe no momento da criação de uma instância da mesma. Para criar um construtor em Python usamos o método(função) especial __init__(). O método __init__, se existir, é invocado automaticamente quando se criam instancias de uma classe.Entao vamos refazer a nossa classe Cachorros, adicionando agora um construtor que fara com que se criem cachorrinhos com nomes diferentes:

class Cachorros:    def __init__(self,nome):        self.nome=nome #Não se esquecerá do self, pois não?        patas=4        self.cor=cor        alimento=”ossos”

Agora para criar os cachorrinhos, temos de indicar o seu nome no momento do seu nascimento’:

>>>c=Cachorros(’Rex’)>>>d=Cachorros(’Laica’)

Poderíamos muito bem passar todos os atributos como argumentos do __init__. Na verdade é uma questão de lógica, pois não precisamos inicializar o numero de patas para cada cachorro, nem o alimento, pois estas propriedades são comuns a todos os Cachorros.

Argumentos default e ordem de passagem

Como vimos nas funções, e possível criar métodos com argumentos default( já que métodos não passam de funções especiais!).Também é possível passar os argumentos em qualquer ordem, tal como nas funções. Veja os exemplos no fim da aula.

Atributos especiais __doc__ e __module__

Quando aplicamos a função dir() sobre as nossas classes vimos que ela já tinha dois atributos: __doc__ e __module__. Não preciso falar da função do doc, é a mesma que para funções. Isso mostra que também podemos criar docstrings para classes e instancias(obviamente). O atributo __module__ contém informações sobre o modulo a qual a nossa classe pertence. Se criarmos a nossa classe no IDLE ou chamarmos este atributo no mesmo programa onde a nossa classe foi criada, este atributo retorna __main__, caso contrário retorna o nome do modulo. Pode acreditar, essas funções especiais ainda vão te ajudar.Para classes torna-se mais interessante em vez de dir() e __doc__, usar a funcao help(), que retorna todos os métodos da classe com as suas respectivas docstrings.Como estamos falando de módulos, vamos recordar a criação de módulos, simulando a criação de um módulo para um jogo, que vai conter as classes para a criação das personagens do jogo. O módulo terá 3 classes: Pessoa, Monstro e Carro( uma simulação mesmo!):

class Pessoa:    def __init__(self,nome,idade):        self.nome=nome        self.idade=idade        self.vidas=100    def andar():        print("Estou andando")    def atirar(self,inimigo): #Diminui o sangue do inimigo        if inimigo.vidas&gt;0:            inimigo.vidas=inimigo.vidas-5        if inimigo.vidas<=0: #Se depois disso o sangue for menor que 0             inimigo.morrer() #O inimigo morre             print("Estou matando um inimigo")     def morrer():         print("Fui morto") class Monstro:     def __init__(self,modelo):         self.modelo=modelo         if self.modelo==1: #A capacidade de vida do monstro dependera do modelo             self.vidas=100         elif self.modelo==2:             self.vidas=50         else:             self.vidas=20 #Este e o mais fraco de todos, morre com 5 tiros apenas(Nem da para ser Zumbi heheeh)     def atirar(self,ator): #Diminui o sangue do ator         if ator.vidas&gt;0:            ator.vidas=ator.vidas-5        if ator.vidas&lt;=0: #Se depois disso o sangue for menor que 0              ator.morrer() #O ator morre             print("Estou matando um inimigo")     def voar(): #Os monstros voam!!!         print("Estou a voar")     def morrer():         print("Estou a morrer") class Carro:     def __init__(self,modelo,cor):         self.modelo=modelo         self.cor=cor         self.velocidade=0     def aumentarVelociade():         self.velocidade=self.velocidade+5     def travar():         while self.velocidade>0:            self.velocidade=self.velocidade-1 #A velocidade reduz gradualmente

Agora já podemos praticar os conceitos aprendidos até aqui, desde introspecção até criação de instancias!!!Experimente fazer p=Pessoa(idade=3,nome=’ator’) para ver que a ordem de passagem de parâmetros pode ser mudada.Vai praticando outros conceitos, enquanto eu preparo outro problema, como por exemplo: Se os nossos inimigos fossem pessoas, será que tínhamos de ter duas classes separadas ou uma só para Pessoas e Monstros? Mas isso é problema da próxima aula, onde falaremos de Herança entre classes em PythonAté lá!!!

Receba nossas actualizações por email

Ver Campanhas anteriores.

(Visited 322 times, 1 visits today)
Share