Conceito

Programação orientada a objetos é um dos paradigmas de programação. Alguns dos principais paradigmas utilizados hoje no mercado:
  • Funcional
  • Lógico
  • Declarativo
  • Imperativo
  • Orientado a objetos
  • Orientado a eventos
Programação orientada a objetos é uma das muitas técnicas utilizadas para modelar sistemas complexos, descrevendo uma coleção de objetos que interagem através de seus dados e comportamento.

Tudo em python é objeto

Python é essencialmente orientado a objeto, assim como Ruby. Todos os tipos herdam da classe object, até mesmo os tipos numéricos.

Faça o seguinte teste no console python:


isinstance(1, object)

Saída: True

Objetos e classes

Como exemplo, podemos supor que as maçãs vão ficar em barris e laranjas em cestas. Agora, temos quatro tipos de objetos: maçãs, laranjas, cestas e barris.

Na modelagem orientada a objetos, o termo usado para tipos de objetos é classe.

Em termos técnicos, agora temos quatro classes de objetos.

Classes descrevem objetos

Objetos são instâncias de classes que podem ser associadas umas às outras.

Especificando atributos e comportamentos

  • Uma instância de objeto é um objeto específico com seu próprio conjunto de dados e comportamentos;
  • Nós também podemos especificar o tipo para cada atributo;
  • Existem atributos implícitos que pode tornar explícita as associações;
  • Comportamentos são ações chamadas métodos.

Ocultando detalhes e criando a interface pública

A interface é a coleção de atributos e métodos que outros objetos podem usar para interagir com esse objeto. Elas não precisam, e muitas vezes não são permitidas, acessar o funcionamento do objeto. Ex: A interface para a televisão é o controle remoto, cada botão no controle remoto representa um método que pode ser chamado no objeto televisão. O ocultamento de informações também é conhecido como encapsulamento. O modelo é uma abstração de um conceito real.

Composição e herança

Composição é o ato de reunir vários objetos para compor um novo. Um objeto pode herdar recursos e comportamentos de um outro. Ex. Jogo de Xadrez:

Herança fornece abstração

O polimorfismo é a capacidade de tratar uma classe de forma diferente, dependendo de qual subclasse é implementada. No exemplo do xadrez: o tabuleiro não precisa saber com que tipo de peça está lidando. Tudo o que tem fazer é chamar o método de movimento e a subclasse adequada vai cuidar de mover como um cavalo, ou um peão, ou um bispo, etc.

Polimorfismo é uma palavra que raramente é usada em programação Python.

Herança múltipla

Permite que uma subclasse herde a funcionalidade de várias classes pai.

Partiu prática! ;)

Criando classes Python


class MyFirstClass:
    pass
Instanciando a classe, isto é, criando dois objetos do tipo MyFirstClassna memória.

a = MyFirstClass()
b = MyFirstClass()

A classe é como se fosse a fôrma do objeto a ser criado.

print(a) ## <__main__.MyFirstClass object at 0xb7b7faec>
print(b) ## <__main__.MyFirstClass object at 0xb7b7fbac>

Criando a classe ponto


class Point:
    pass

Adicionando atributos


p1 = Point()
p2 = Point()
p1.x = 5
p1.y = 4
p2.x = 3
p2.y = 6
print(p1.x, p1.y)
print(p2.x, p2.y)

Fazendo algo


class Point:
    def reset(self):
        self.x = 0
        self.y = 0
O argumento self no método é simplesmente uma referência ao próprio objeto de onde o método está sendo invocado.

p = Point()
p.reset()
print(p.x, p.y)
# Mesmo comportamento
p = Point()
Point.reset(p)
print(p.x, p.y)
Chamando um método no objeto p automaticamente passa esse objeto para o método.

Múltiplos argumentos para um método


import math
class Point:
    def move(self, x, y):
        self.x = x
        self.y = y
    def reset(self):
        self.move(0, 0)
    def calculate_distance(self, other_point):
        return math.sqrt((self.x - other_point.x)**2 + (self.y - other_point.y)**2)

point1 = Point()
point2 = Point()

point1.reset()
point2.move(5,0)
print(point2.calculate_distance(point1))
assert (point2.calculate_distance(point1) == point1.calculate_distance(point2))
point1.move(3,4)
print(point1.calculate_distance(point2))
print(point1.calculate_distance(point1))

# Exceção #
point = Point()
point.x = 5
print(point.x)
print(point.y)
Como não definimos o y, na hora do print(point.y) ele dá essa exceção: Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Point' object has no attribute 'y'

Construtor

Múltiplos argumentos para um método


class Point:
    def __init__(self, x, y): # def __init__(self, x=0, y=0)
        self.move(x, y)  
    def move(self, x, y):
        self.x = x
        self.y = y
    def reset(self):
        self.move(0, 0)

# Construindo um Ponto
point = Point(3, 5)
print(point.x, point.y)

Nos vemos na próxima aula e continuaremos a aprender sobre OO em python.

Esse são meus link de afiliados na Hostinger: Hostinger

Curta a página do Código Fluente no Facebook https://www.facebook.com/Codigofluente-338485370069035/

Meu link de referidos na digitalocean .

Quem se cadastrar por esse link, ganha $100.00 dólares de crédito na digitalocean:

Digital Ocean

E o da one.com:

One.com

Obrigado, até a próxima e bons estudos. ;)