Skip to content

Instantly share code, notes, and snippets.

@smwhr
Last active July 26, 2023 09:42
Show Gist options
  • Save smwhr/779e1a63e7c2d1e4dbe33411e99118e1 to your computer and use it in GitHub Desktop.
Save smwhr/779e1a63e7c2d1e4dbe33411e99118e1 to your computer and use it in GitHub Desktop.
Julien Raconte : la composition
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()
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()
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()
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()
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()
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()
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