Datos de instancia y de clase

Programación orientada a objetos en Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Principios básicos de POO

 

Herencia:

  • Extender la funcionalidad del código existente

Polimorfismo:

  • Crear una interfaz unificada

Encapsulamiento:

  • Agrupar datos y métodos
Programación orientada a objetos en Python

Datos a nivel de instancia

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 son atributos de instancia
  • self se vincula a una instancia
Programación orientada a objetos en Python

Datos a nivel de clase

  • Datos compartidos entre todas las instancias de una clase
  • Definir atributos de clase en el cuerpo de class
class MyClass:
    # Definir un atributo de clase
    CLASS_ATTR_NAME = attr_value


  • "Variable global" dentro de la clase
Programación orientada a objetos en Python

Datos a nivel de clase

class Employee:
  # Definir un atributo de clase
  MIN_SALARY = 30000    #<--- no self. 

def __init__(self, name, salary): self.name = name # Usar el nombre de la clase para acceder al atributo de clase if salary >= Employee.MIN_SALARY: self.salary = salary else: self.salary = Employee.MIN_SALARY
  • MIN_SALARY se comparte entre todas las instancias
  • No usar self para definir un atributo de clase
  • usar ClassName.ATTR_NAME para acceder al valor del atributo de clase
Programación orientada a objetos en Python

Datos a nivel de clase

class Employee:
  # Definir un atributo de clase
  MIN_SALARY = 30000    

def __init__(self, name, salary): self.name = name # Usar el nombre de la clase para acceder al atributo de clase 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
Programación orientada a objetos en Python

¿Por qué usar atributos de clase?

Constantes globales relacionadas con la clase

 

  • valores mínimos/máximos para atributos
  • valores y constantes comunes, ej. pi para una clase Circle
  • ...
Programación orientada a objetos en Python

Métodos de clase

  • Los métodos ya están "compartidos": mismo código para cada instancia
  • Los métodos de clase no pueden usar datos a nivel de instancia
class MyClass:

  @classmethod                         # <---usar decorador para declarar un método de clase

def my_awesome_method(cls, args...): # <---el argumento cls se refiere a la clase # Hacer cosas aquí # No se pueden usar atributos de instancia :(
MyClass.my_awesome_method(args...)
Programación orientada a objetos en Python

Constructores 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
  • Solo puede haber un __init__()

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

  • Usar métodos de clase para crear objetos
  • Usar return para devolver un objeto
  • cls(...) llamará a __init__(...)
Programación orientada a objetos en Python

Constructores 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)        

archivo de texto que contiene una línea con el nombre del empleado

# Crear un empleado sin llamar a Employee()
emp = Employee.from_file("employee_data.txt")
type(emp)
__main__.Employee
Programación orientada a objetos en Python

¡Vamos a practicar!

Programación orientada a objetos en Python

Preparing Video For Download...