ch15: draft examples
This commit is contained in:
41
15-more-types/cafeteria/cafeteria.py
Normal file
41
15-more-types/cafeteria/cafeteria.py
Normal file
@@ -0,0 +1,41 @@
|
||||
from typing import TypeVar, Generic
|
||||
|
||||
|
||||
class Beverage:
|
||||
"""Any beverage"""
|
||||
|
||||
|
||||
class Juice(Beverage):
|
||||
"""Any fruit juice"""
|
||||
|
||||
|
||||
class OrangeJuice(Juice):
|
||||
"""Delicious juice Brazilian oranges"""
|
||||
|
||||
|
||||
class Coak(Beverage):
|
||||
"""Secret formula with lots of sugar"""
|
||||
|
||||
|
||||
BeverageT = TypeVar('BeverageT', bound=Beverage)
|
||||
JuiceT = TypeVar('JuiceT', bound=Juice)
|
||||
|
||||
|
||||
class BeverageDispenser(Generic[BeverageT]):
|
||||
|
||||
beverage: BeverageT
|
||||
|
||||
def __init__(self, beverage: BeverageT) -> None:
|
||||
self.beverage = beverage
|
||||
|
||||
def dispense(self) -> BeverageT:
|
||||
return self.beverage
|
||||
|
||||
|
||||
class JuiceDispenser(BeverageDispenser[JuiceT]):
|
||||
pass
|
||||
|
||||
|
||||
class Cafeteria:
|
||||
def __init__(self, dispenser: BeverageDispenser[JuiceT]):
|
||||
self.dispenser = dispenser
|
||||
23
15-more-types/cafeteria/cafeteria_demo.py
Normal file
23
15-more-types/cafeteria/cafeteria_demo.py
Normal file
@@ -0,0 +1,23 @@
|
||||
from cafeteria import (
|
||||
Cafeteria,
|
||||
BeverageDispenser,
|
||||
JuiceDispenser,
|
||||
Juice,
|
||||
OrangeJuice,
|
||||
Coak,
|
||||
)
|
||||
|
||||
orange = OrangeJuice()
|
||||
|
||||
orange_dispenser: JuiceDispenser[OrangeJuice] = JuiceDispenser(orange)
|
||||
|
||||
juice: Juice = orange_dispenser.dispense()
|
||||
|
||||
soda = Coak()
|
||||
|
||||
## Value of type variable "JuiceT" of "JuiceDispenser" cannot be "Coak"
|
||||
# soda_dispenser = JuiceDispenser(soda)
|
||||
|
||||
soda_dispenser = BeverageDispenser(soda)
|
||||
|
||||
arnold_hall = Cafeteria(soda_dispenser)
|
||||
Reference in New Issue
Block a user