Python - Visão Geral
Orientação a Objetos:
Testes de Segurança:
Alguns cuidados devem ser tomados ao se alterar atributos em um objeto.
Exemplo:
class Classe_1:
a = [5, 3]
h = Classe_1()
h.a.append(2) # Alterando atributo da Classe
print(h.a) # [5, 3, 2]
g = Classe_1()
print(g.a) # [5, 3, 2]
class Classe_2:
a = 1
h = Classe_2()
h.a = 2; # Alterando apenas o atributo do objeto
print(h.a) # 2
g = Classe_2()
print(g.a) # 1
Na 1ª parte do código com a Classe Classe_1, por ter um atributo mutável (listas e dicionários), ocorre a possibilidade de alteração do atributo da Classe.
Já para atributos não mutáveis (Classe_2), as atribuições são sempre feitas na variável da instância local, e não da classe.
Evite usar estas variáveis mutáveis como atributos de Classe, são fontes de erros de programação difíceis de serem encontrados.
--------------------------------------------------------------------
Funções úteis para OO:
Exemplos:
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
--------------------------------------------------------------------
isinstance(): verifica se um Objeto é uma instância da Classe.
obj1 = Quadrado(15)
print(isinstance(obj1, Quadrado)) # True
print(isinstance(obj1, Retangulo)) # True
--------------------------------------------------------------------
issubclass(): verifica se uma Classe é uma Subclasse (Herança).
print(issubclass(Quadrado, Retangulo)) # True
print(issubclass(Retangulo, Quadrado)) # False
--------------------------------------------------------------------
hasattr(): verifica se um Objeto possui um dado Atributo.
print(hasattr(f1, 'lado_a')) # True
print(hasattr(f1, 'lado')) # False
--------------------------------------------------------------------
Introspecção e reflexão:
em tempo de execução, conseguimos informações a respeito do tipo dos objetos, incluindo informações sobre a hierarquia de classes.
Comandos:
dir(): permite conhecer todos os atributos e métodos de
uma classe ou instância.
print(dir(obj2)) # ['__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']
--------------------------------------------------------------------
__class__: este atributo da instância armazena o seu objeto classe correspondente.
print(obj2.__class__) # <class '__main__.Quadrado'>
--------------------------------------------------------------------
__dict__: apresenta um dicionário com os atributos de uma instância.
print(obj2.__dict__) # {'lado_a': 20, 'lado_b': 20}
--------------------------------------------------------------------
__module__: retorna uma String com o nome do módulo onde a Instância ou a Classe foi importada.
print(obj2.__module__) # __main__
--------------------------------------------------------------------
__bases__: apresenta uma tupla com as classes herdadas por Classe.
print(Quadrado.__bases__) # (<class '__main__.Retangulo'>,)
--------------------------------------------------------------------
__name__: apresenta uma string com o nome da Classe.
print(Quadrado.__name__) # Quadrado
--------------------------------------------------------------------
Nenhum comentário:
Postar um comentário