Dados de instância e de classe

Programação orientada a objetos em Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Princípios básicos da POO

 

Herança:

  • Estender a funcionalidade do código existente

Polimorfismo:

  • Criar uma interface unificada

Encapsulamento:

  • Agrupar dados e métodos
Programação orientada a objetos em Python

Dados no nível da instância

class Employee:
    def __init__(self, name, salary):
       self.name = name
       self.salary = salary

emp1 = Employee("Teo Mille", 50000) 
emp2 = Employee("Marta Popov", 65000)
  • name, salary são atributos de instância
  • self se refere a uma instância
Programação orientada a objetos em Python

Dados no nível da classe

  • Dados compartilhados entre todas as instâncias de uma classe
  • Defina atributos de classe no corpo da class
class MyClass:
    # Defina um atributo de classe
    CLASS_ATTR_NAME = attr_value


  • "Variável global" dentro da classe
Programação orientada a objetos em Python

Dados no nível da classe

class Employee:
  # Defina um atributo de classe
  MIN_SALARY = 30000    #<--- sem self. 

def __init__(self, name, salary): self.name = name # Use o nome da classe para acessar o atributo de classe if salary >= Employee.MIN_SALARY: self.salary = salary else: self.salary = Employee.MIN_SALARY
  • MIN_SALARY é compartilhado entre todas as instâncias
  • Não use self para definir atributo de classe
  • use ClassName.ATTR_NAME para acessar o valor do atributo de classe
Programação orientada a objetos em Python

Dados no nível da classe

class Employee:
  # Defina um atributo de classe
  MIN_SALARY = 30000    

def __init__(self, name, salary): self.name = name # Use o nome da classe para acessar o atributo de classe if salary >= Employee.MIN_SALARY: self.salary = salary else: self.salary = Employee.MIN_SALARY
emp1 = Employee("TBD", 40000)
print(emp1.MIN_SALARY)
30000
emp2 = Employee("TBD", 60000)
print(emp2.MIN_SALARY)
30000
Programação orientada a objetos em Python

Por que usar atributos de classe?

Constantes globais relacionadas à classe

 

  • valores mínimos/máximos para atributos
  • valores e constantes comuns, ex.: pi para uma classe Circle
  • ...
Programação orientada a objetos em Python

Métodos de classe

  • Métodos já são "compartilhados": mesmo código para cada instância
  • Métodos de classe não podem usar dados de instância
class MyClass:

  @classmethod                         # <---use decorador para declarar um método de classe

def my_awesome_method(cls, args...): # <---argumento cls refere-se à classe # Faça algo aqui # Não pode usar atributos de instância :(
MyClass.my_awesome_method(args...)
Programação orientada a objetos em Python

Construtores alternativos

class Employee:
  MIN_SALARY = 30000
  def __init__(self, name, salary=30000):
      self.name = name
      if salary >= Employee.MIN_SALARY:
        self.salary = salary
      else:
        self.salary = Employee.MIN_SALARY
  • Só pode ter um __init__()

  @classmethod
  def from_file(cls, filename):
      with open(filename, "r") as f:
          name = f.readline()
      return cls(name)

  • Use métodos de classe para criar objetos
  • Use return para retornar um objeto
  • cls(...) chamará __init__(...)
Programação orientada a objetos em Python

Construtores alternativos

class Employee:
  MIN_SALARY = 30000
  def __init__(self, name, salary=30000):
      self.name = name
      if salary >= Employee.MIN_SALARY:
        self.salary = salary
      else:
        self.salary = Employee.MIN_SALARY

  @classmethod
  def from_file(cls, filename):
      with open(filename, "r") as f:
          name = f.readline()
      return cls(name)        

arquivo de texto contendo uma linha com o nome do funcionário

# Crie um funcionário sem chamar Employee()
emp = Employee.from_file("employee_data.txt")
type(emp)
__main__.Employee
Programação orientada a objetos em Python

Vamos praticar!

Programação orientada a objetos em Python

Preparing Video For Download...