Skip to content

Instantly share code, notes, and snippets.

@marcorichetta
Created March 21, 2019 19:59
Show Gist options
  • Save marcorichetta/74a5d5b35324c43ccccb4ac4b82da26f to your computer and use it in GitHub Desktop.
Save marcorichetta/74a5d5b35324c43ccccb4ac4b82da26f to your computer and use it in GitHub Desktop.
OOP Corey Schafer Tutorial
class Empleado:
# Class variables
aumento = 1.10
numEmpleados = 0
def __init__(self, first, last, pay):
""" El método `__init__` se ejecuta cada vez que se crea un nuevo `Empleado` """
self.first = first
self.last = last
self.pay = pay
self.email = first + '.' + last + '@mail.com'
# Si pusiera `self` la variable numEmpleados aumentaría solo para la instancia
# creada y no para la clase en sí
Empleado.numEmpleados += 1
def getFullName(self):
""" Incluyo `self` porque al llamar a este método desde una instancia
`emp1.getFullName()`, la instancia es pasada como argumento """
return f'{self.first} {self.last}'
# Regular Method
def applyRaise(self):
""" Al colocar el `self.aumento` puedo modificar esta variable para
una instancia específica o para toda la clase """
self.pay = int(self.pay * self.aumento)
@classmethod
def from_string(cls, emp_str):
""" El método de clase pasa automáticamente como 1er arg la clase.
Tiene el funcionamiento de un decorator"""
first, last, pay = emp_str.split('-')
return cls(first, last, pay)
@staticmethod
def is_workday(day):
""" Un static method no debería acceder a la clase
ni a la instancia que lo contiene."""
# 5 y 6 equivalen a Sab y Dom
if day.weekday() == 5 or day.weekday() == 6:
return False
return True
def __repr__(self):
return f'Empleado: {self.first}, {self.last}, {self.pay}'
def __str__(self):
return f'{self.getFullName()} - {self.email}'
class Developer(Empleado):
""" Heredo todas las propiedades de la clase `Empleado`
`Developer` toma 1 arg más en la creación
Con `super()` hacemos que los primeros 3 arg sean
pasados a la clase `Empleado`, mientras que a `prog_lang`
lo maneja sólo la clase `Developer`"""
# Al aplicar aumento a un `Developer` se toma esta variable
# por encima del 10% de la clase `Empleado`
aumento = 1.20
def __init__(self, first, last, pay, prog_lang):
super().__init__(first, last, pay)
self.prog_lang = prog_lang
class Manager(Empleado):
def __init__(self, first, last, pay, empleados = None):
super().__init__(first, last, pay)
if empleados == None:
self.empleados = []
else:
self.empleados = empleados
def addEmpleado(self, emp):
if emp not in self.empleados:
self.empleados.append(emp)
def remEmpleado(self, emp):
if emp in self.empleados:
self.empleados.remove(emp)
def getEmpleados(self):
print('Empleados a cargo')
for emp in self.empleados:
print('->', emp.getFullName(), emp.__class__)
# Creo 2 instancias
emp1 = Empleado('Mark', 'Rich', 1000)
emp2 = Empleado('Nati', 'Vera', 2000)
# 2 maneras de obtener el mismo resultado
print(Empleado.getFullName(emp2))
print(emp2.getFullName())
# Modifico aumento SÓLO a emp2
emp2.aumento = 1.20
print(emp1.aumento)
print(emp2.aumento)
print(Empleado.aumento)
# Cantidad de empleados creados: 2
print(Empleado.numEmpleados)
# Agregué un método de clase (@decorator) que me permite
# extender la funcionalidad de la clase base
emp_str_1 = 'Juan-Renz-100'
#emp_str_2 = 'Rick-James-999'
emp3 = Empleado.from_string(emp_str_1)
emp4 = Empleado.from_string(emp_str='Rick-James-999')
print(emp3.__dict__)
print(emp4.__dict__)
import datetime
hoy = datetime.date(2019, 3, 17) # Domingo
print(Empleado.is_workday(hoy))
emp5 = Developer('Corey', 'Schafer', 50000, 'Python')
print(emp5.pay)
emp5.applyRaise()
print(emp5.pay)
print(emp5.prog_lang)
# Ayuda sobre lo que hereda la clase Developer
#print(help(Developer))
man1 = Manager('Sue', 'Smith', 80000, [emp1, emp2])
man1.addEmpleado(emp3)
man1.addEmpleado(emp5)
man1.remEmpleado(emp1)
man1.getEmpleados()
print(emp1.__repr__())
print(emp2.__str__())
print(float.__add__(1.04, 2.43))
print(str.__len__('hello world'))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment