quinta-feira, 18 de janeiro de 2018

Dia 11

Python - Visão Geral

Encapsulamento - Atributos Privados/Protegidos:
Um Atributo Privado não pode ser acessado fora da Classe, isto é, este Atributo está disponível apenas dentro da própria Classe.
Para definir um Atributo como privado em uma Classe, usa-se o "_" ou "__" no início do nome do Atributo.
Exemplo:
class teste:
  atr1 = "atributo publico"
  _atr2 = "atributo privado por convenção"
  __atr3 = "atributo privado"

a = teste
print(a.atr1) # 'atributo publico'
print(a._atr2) # 'atributo privado por convenção
print(a.__atr3) # 'ERRO'

Apesar do uso de "__", existe uma forma de acessar este Atributo fora da Classe:
print(a._teste__atr3) # atributo privado
--------------------------------------------------------------------
Herança:
É uma forma de criar classes novas a partir de outras Classes.
Python suporta herança simples e herança múltiplas. 
Exemplo:
Criação da Classe Quadrado estendendo da Classe Retangulo.
Exemplo:
class Retangulo:
  lado_a = None
  lado_b = None
  def __init__(self, lado_a, lado_b):
    self.lado_a = lado_a
    self.lado_b = lado_b
    print ('Criando uma nova instância retângulo.')
  def calcula_area(self):
    return self.lado_a * self.lado_b
  def calcula_perimetro(self):
    return 2 * (self.lado_a + self.lado_b)

class Quadrado(Retangulo):
  def __init__(self, lado):
    self.lado_a = self.lado_b = lado

obj1= Quadrado(10)
print(dir(obj1)) # ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'calcula_area', 'calcula_perimetro', 'lado_a', 'lado_b']
print(obj1.lado_a, obj1.lado_b) # (10. 10)
print(obj1.calcula_area(), obj1.calcula_perimetro()) # (100, 40)

Com a Herança, a Classe Quadrado tem disponível os atributos e métodos da Classe Retangulo.
--------------------------------------------------------------------
Outra forma de criar a Classe Quadrado: A partir da Classe Quadrado invocamos o método Construtor da Classe Retangulo: 
Exemplo:
class Quadrado(Retangulo):
  def __init__(self, lado):
    Retangulo.__init__(self, lado, lado)

obj2 = Quadrado(10) # Criando uma nova instância retângulo.
print(obj2.lado_a, obj2.lado_b) # (10, 10)
print(obj2.calcula_area(), obj2.calcula_perimetro()) # (100, 40) 
--------------------------------------------------------------------

Nenhum comentário:

Postar um comentário