Created
March 21, 2019 19:59
-
-
Save marcorichetta/74a5d5b35324c43ccccb4ac4b82da26f to your computer and use it in GitHub Desktop.
OOP Corey Schafer Tutorial
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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