Last active
July 26, 2023 09:42
-
-
Save smwhr/779e1a63e7c2d1e4dbe33411e99118e1 to your computer and use it in GitHub Desktop.
Julien Raconte : la composition
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 Vehicle: | |
def drive(self): | |
print("Vroum Vroum") | |
class Bike (Vehicle): | |
def drive(self): | |
print("Swissssh") | |
class Car (Vehicle): | |
pass | |
class Truck (Vehicle): | |
def drive(self): | |
print("VROUM VROUM") | |
if __name__ == "__main__": | |
b = Bike() | |
b.drive() | |
c = Car() | |
c.drive() | |
t = Truck() | |
t.drive() |
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
all_vehicles = __import__('01_inheritance') | |
class TestRun: | |
def __init__(self, vehicles): | |
self.vehicles = vehicles | |
def run(self): | |
for vehicle in self.vehicles: | |
vehicle.drive() | |
if __name__ == "__main__": | |
t = TestRun([ | |
all_vehicles.Bike(), | |
all_vehicles.Car(), | |
all_vehicles.Car(), | |
all_vehicles.Truck(), | |
all_vehicles.Bike(), | |
]) | |
t.run() |
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
all_vehicles = __import__('01_inheritance') | |
class TestRun: | |
def __init__(self, vehicles): | |
self.vehicles = vehicles | |
def run(self): | |
for vehicle in self.vehicles: | |
vehicle.drive() | |
class Trotinette: | |
def drive(self): # this is called duck typing | |
print("Wiiiiiz") | |
if __name__ == "__main__": | |
t = TestRun([ | |
all_vehicles.Bike(), | |
all_vehicles.Car(), | |
all_vehicles.Car(), | |
all_vehicles.Truck(), | |
all_vehicles.Bike(), | |
Trotinette(), | |
]) | |
t.run() |
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
LAP_LENGTH = 40*60 | |
class Vehicle: | |
def __init__(self, name): | |
self.name = name | |
def _forward(self): | |
return LAP_LENGTH/self._speed | |
def drive(self): | |
print(f"moves for {self._forward()} min") | |
class Bike (Vehicle): | |
def __init__(self, name): | |
self.name = name | |
self._speed = 15 | |
def drive(self): | |
print(f"Swissssh for {self._forward()} min") | |
class Car (Vehicle): | |
def __init__(self, name): | |
self.name = name | |
self._speed = 200 | |
class Truck (Vehicle): | |
def __init__(self, name): | |
self.name = name | |
self._speed = 80 | |
def drive(self): | |
print(f"VROUM VROUM for {self._forward()} min") | |
class ElectricVehicle(Vehicle): | |
pass | |
class ElectricCar(ElectricVehicle, Car): | |
pass | |
class TestRun: | |
def __init__(self, vehicles): | |
self.vehicles = vehicles | |
def run(self): | |
for vehicle in self.vehicles: | |
print(vehicle.name, end=": ") | |
vehicle.drive() | |
if __name__ == "__main__": | |
t = TestRun([ | |
Bike("Bicyclette bleue"), | |
Car("Voiture rouge"), | |
Car("Voiture verte"), | |
Truck("Camion"), | |
Bike("Bicyclette rouge"), | |
]) | |
t.run() |
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
test_run = __import__('02_inheritance') | |
class Vehicle: | |
def __init__(self, name, motor, track): | |
self.name = name | |
self._motor = motor | |
self._track = track | |
def drive(self): | |
speed = self._motor.get_speed() | |
distance = self._track.get_length() | |
print(f"moves for {distance / speed} min") | |
class Motor: | |
def __init__(self, speed): | |
self.speed = speed | |
def get_speed(self): | |
return self.speed | |
class ElectricMotor(Motor): | |
def __init__(self): | |
self.speed = 25 | |
class LegMotor(Motor): | |
def __init__(self): | |
self.speed = 18 | |
class EssenceMotor(Motor): | |
def __init__(self): | |
self.speed = 200 | |
class DieselMotor(Motor): | |
def __init__(self): | |
self.speed = 80 | |
class Track: | |
def __init__(self, length): | |
self.length = length | |
def get_length(self): | |
return self.length | |
class TestRun: | |
def __init__(self, vehicles): | |
self.vehicles = vehicles | |
def run(self): | |
for vehicle in self.vehicles: | |
print(vehicle.name, end=": ") | |
vehicle.drive() | |
if __name__ == "__main__": | |
track = Track(4000) | |
t = TestRun([ | |
Vehicle("Bicyclette bleue", LegMotor(), track), | |
Vehicle("Voiture rouge", ElectricMotor(), track), | |
Vehicle("Voiture verte", EssenceMotor(), track), | |
Vehicle("Camion", DieselMotor(), track), | |
Vehicle("Bicyclette rouge", LegMotor(), track), | |
]) | |
t.run() |
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
test_run = __import__('02_inheritance') | |
class Vehicle: | |
def __init__(self, name, motor, track): | |
self.name = name | |
self._motor = motor | |
self._track = track | |
def drive(self): | |
speed = self._motor.get_speed() | |
distance = self._track.get_length() | |
print(f"moves for {distance / speed} min") | |
class Motor: | |
def __init__(self, speed): | |
self.speed = speed | |
def get_speed(self): | |
return self.speed | |
class ElectricMotor(Motor): | |
def __init__(self): | |
self.speed = 25 | |
class LegMotor(Motor): | |
def __init__(self): | |
self.speed = 18 | |
class EssenceMotor(Motor): | |
def __init__(self): | |
self.speed = 200 | |
class DieselMotor(Motor): | |
def __init__(self): | |
self.speed = 80 | |
class Track: | |
def __init__(self, length): | |
self.length = length | |
def get_length(self): | |
return self.length | |
class TestRun: | |
def __init__(self, vehicles): | |
self.vehicles = vehicles | |
def run(self): | |
for vehicle in self.vehicles: | |
print(vehicle.name, end=": ") | |
vehicle.drive() | |
if __name__ == "__main__": | |
track = Track(4000) | |
t = TestRun([ | |
Vehicle("Bicyclette bleue", LegMotor(), track), | |
Vehicle("Voiture rouge", ElectricMotor(), track), | |
Vehicle("Voiture verte", EssenceMotor(), track), | |
Vehicle("Camion", DieselMotor(), track), | |
Vehicle("Bicyclette rouge", LegMotor(), track), | |
]) | |
t.run() |
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 NotAllowed(Exception): | |
pass | |
class User: | |
def __init__(self, | |
first_name, | |
last_name, | |
street, | |
city, | |
zipcode, | |
is_admin = False, | |
is_doctor = False): | |
self.first_name = first_name | |
self.last_name = last_name | |
self.street = street | |
self.city = city | |
self.zipcode = zipcode | |
self.is_admin = is_admin | |
self.is_doctor = is_doctor | |
self._life = 100 | |
def change_address(self, admin, new_address): | |
if not isinstance(admin, Admin) and admin.can_change_address: | |
raise NotAllowed(f"Only admin with `can_change_address` can change address !") | |
self.street, self.city, self.zipcode = new_address | |
def change_name(self, admin, new_name): | |
if not isinstance(admin, Admin) and admin.can_change_name: | |
raise NotAllowed(f"Only admin with `can_change_name` can change address !") | |
self.first_name, self.last_name = new_name | |
def __repr__(self): | |
return f""" | |
{self.first_name} {self.last_name.upper()} | |
{self.street} | |
{self.zipcode} {self.city.upper()} | |
""" + (f""" | |
{self.first_name} can heal people. | |
""" if self.is_doctor else "") + (f""" | |
{self.first_name} has admin privileges : {self.get_privileges()!r}. | |
""" if self.is_admin else "") + (f""" | |
{self.first_name} has {self._life} life points. | |
""") | |
class Admin(User): | |
def __init__(self, | |
can_change_address, | |
can_change_name, | |
*args, ** kwargs): | |
super().__init__(*args, *kwargs, is_admin = True) | |
self.can_change_address = can_change_address | |
self.can_change_name = can_change_name | |
def get_privileges(self): | |
return { | |
"can_change_address": self.can_change_address, | |
"can_change_name": self.can_change_name, | |
} | |
class Doctor(User): | |
def __init__(self, *args, ** kwargs): | |
super().__init__(*args, *kwargs, is_doctor = True) | |
def heal(self, User): | |
User._life = 100 | |
if __name__ == "__main__": | |
julien = Admin(True, False, "Julien", "Zamor", "127 avenue Gambetta", "Paris", "75020") | |
caroline = Doctor("Caroline", "Quebeck", "16 Impasse de Bochocho", "Plougoumelen", "56400") | |
print(julien) | |
print(caroline) | |
sophie = User("Sophie", "Dauplès", "235 Grande Rue", "Garches", "92380") | |
sophie._life = 75 # elle s'est cognée un peu fort au genou | |
print(sophie) | |
sophie_new_adress = ("La Blaquière", "Millau", "12100") | |
for p in [julien, caroline]: | |
if p.is_admin: | |
sophie.change_address(p, sophie_new_adress) | |
if p.is_doctor: | |
p.heal(sophie) | |
print(sophie) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment