Skip to content

Commit 0165de3

Browse files
author
Arjan Egges
committed
Added object creation and SOLID example.
1 parent 2d20ee7 commit 0165de3

15 files changed

+853
-1
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
# misc
2-
.DS_Store
2+
.DS_Store
3+
*.pyc
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from typing import List
2+
3+
class PoolManager():
4+
def __init__(self, pool):
5+
self.pool = pool
6+
def __enter__(self):
7+
self.obj = self.pool.acquire()
8+
return self.obj
9+
def __exit__(self, type, value, traceback):
10+
self.pool.release(self.obj)
11+
12+
class Reusable:
13+
def test(self):
14+
print(f"Using object {id(self)}")
15+
16+
class ReusablePool:
17+
18+
free: List[Reusable]
19+
in_use: List[Reusable]
20+
21+
def __init__(self, size):
22+
self.size = size
23+
self.free = []
24+
self.in_use = []
25+
for _ in range(0, size):
26+
self.free.append(Reusable())
27+
28+
def acquire(self) -> Reusable:
29+
assert len(self.free) > 0
30+
r = self.free[0]
31+
self.free.remove(r)
32+
self.in_use.append(r)
33+
return r
34+
35+
def release(self, r: Reusable):
36+
self.in_use.remove(r)
37+
self.free.append(r)
38+
39+
def set_size(self, size: int):
40+
self.size = size
41+
42+
43+
# Create reusable pool
44+
pool= ReusablePool(2)
45+
46+
with PoolManager(pool) as r:
47+
r.test()
48+
49+
with PoolManager(pool) as r2:
50+
r2.test()

10 - object creation/object-pool.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from typing import List
2+
3+
4+
5+
class Reusable:
6+
def test(self):
7+
print(f"Using object {id(self)}")
8+
9+
class ReusablePool:
10+
11+
free: List[Reusable]
12+
in_use: List[Reusable]
13+
14+
def __init__(self, size):
15+
self.size = size
16+
self.free = []
17+
self.in_use = []
18+
for _ in range(0, size):
19+
self.free.append(Reusable())
20+
21+
def acquire(self) -> Reusable:
22+
assert len(self.free) > 0
23+
r = self.free[0]
24+
self.free.remove(r)
25+
self.in_use.append(r)
26+
return r
27+
28+
def release(self, r: Reusable):
29+
self.in_use.remove(r)
30+
self.free.append(r)
31+
32+
def set_size(self, size: int):
33+
self.size = size
34+
35+
pool = ReusablePool(2)
36+
r = pool.acquire()
37+
r2 = pool.acquire()
38+
39+
r.test()
40+
r2.test()
41+
42+
pool.release(r2)
43+
r3 = pool.acquire()
44+
r3.test()

10 - object creation/singleton.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Singleton(type):
2+
_instances = {}
3+
def __call__(cls, *args, **kwargs):
4+
if cls not in cls._instances:
5+
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
6+
return cls._instances[cls]
7+
8+
class Logger(metaclass=Singleton):
9+
def __init__(self):
10+
print("Creating Logger")
11+
12+
def log(self, msg):
13+
print(msg)
14+
15+
logger = Logger()
16+
logger2 = Logger()
17+
print(logger)
18+
print(logger2)
19+
logger.log("Hello")
20+
logger2.log("Helloooo")
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
from abc import ABC, abstractmethod
2+
3+
class Order:
4+
items = []
5+
quantities = []
6+
prices = []
7+
status = "open"
8+
9+
def add_item(self, name, quantity, price):
10+
self.items.append(name)
11+
self.quantities.append(quantity)
12+
self.prices.append(price)
13+
14+
def total_price(self):
15+
total = 0
16+
for i in range(len(self.prices)):
17+
total += self.quantities[i] * self.prices[i]
18+
return total
19+
20+
class Authorizer(ABC):
21+
@abstractmethod
22+
def is_authorized(self) -> bool:
23+
pass
24+
25+
26+
class Authorizer_SMS(Authorizer):
27+
28+
authorized = False
29+
30+
def verify_code(self, code):
31+
print(f"Verifying SMS code {code}")
32+
self.authorized = True
33+
34+
def is_authorized(self) -> bool:
35+
return self.authorized
36+
37+
class Authorizer_Google(Authorizer):
38+
39+
authorized = False
40+
41+
def verify_code(self, code):
42+
print(f"Verifying Google auth code {code}")
43+
self.authorized = True
44+
45+
def is_authorized(self) -> bool:
46+
return self.authorized
47+
48+
class Authorizer_Robot(Authorizer):
49+
50+
authorized = False
51+
52+
def not_a_robot(self):
53+
self.authorized = True
54+
55+
def is_authorized(self) -> bool:
56+
return self.authorized
57+
58+
59+
class PaymentProcessor(ABC):
60+
61+
@abstractmethod
62+
def pay(self, order):
63+
pass
64+
65+
66+
class DebitPaymentProcessor(PaymentProcessor):
67+
68+
def __init__(self, security_code, authorizer: Authorizer):
69+
self.security_code = security_code
70+
self.authorizer = authorizer
71+
72+
def pay(self, order):
73+
if not self.authorizer.is_authorized():
74+
raise Exception("Not authorized")
75+
print("Processing debit payment type")
76+
print(f"Verifying security code: {self.security_code}")
77+
order.status = "paid"
78+
79+
class CreditPaymentProcessor(PaymentProcessor):
80+
81+
def __init__(self, security_code):
82+
self.security_code = security_code
83+
84+
def pay(self, order):
85+
print("Processing credit payment type")
86+
print(f"Verifying security code: {self.security_code}")
87+
order.status = "paid"
88+
89+
class PaypalPaymentProcessor(PaymentProcessor):
90+
91+
def __init__(self, email_address, authorizer: Authorizer):
92+
self.email_address = email_address
93+
self.authorizer = authorizer
94+
95+
def pay(self, order):
96+
if not self.authorizer.is_authorized():
97+
raise Exception("Not authorized")
98+
print("Processing paypal payment type")
99+
print(f"Using email address: {self.email_address}")
100+
order.status = "paid"
101+
102+
103+
order = Order()
104+
order.add_item("Keyboard", 1, 50)
105+
order.add_item("SSD", 1, 150)
106+
order.add_item("USB cable", 2, 5)
107+
108+
print(order.total_price())
109+
authorizer = Authorizer_Robot()
110+
# authorizer.verify_code(465839)
111+
authorizer.not_a_robot()
112+
processor = PaypalPaymentProcessor("[email protected]", authorizer)
113+
processor.pay(order)
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
from abc import ABC, abstractmethod
2+
3+
class Order:
4+
items = []
5+
quantities = []
6+
prices = []
7+
status = "open"
8+
9+
def add_item(self, name, quantity, price):
10+
self.items.append(name)
11+
self.quantities.append(quantity)
12+
self.prices.append(price)
13+
14+
def total_price(self):
15+
total = 0
16+
for i in range(len(self.prices)):
17+
total += self.quantities[i] * self.prices[i]
18+
return total
19+
20+
class SMSAuthorizer:
21+
22+
authorized = False
23+
24+
def verify_code(self, code):
25+
print(f"Verifying SMS code {code}")
26+
self.authorized = True
27+
28+
def is_authorized(self) -> bool:
29+
return self.authorized
30+
31+
32+
class PaymentProcessor(ABC):
33+
34+
@abstractmethod
35+
def pay(self, order):
36+
pass
37+
38+
39+
class DebitPaymentProcessor(PaymentProcessor):
40+
41+
def __init__(self, security_code, authorizer: SMSAuthorizer):
42+
self.security_code = security_code
43+
self.authorizer = authorizer
44+
45+
def pay(self, order):
46+
if not self.authorizer.is_authorized():
47+
raise Exception("Not authorized")
48+
print("Processing debit payment type")
49+
print(f"Verifying security code: {self.security_code}")
50+
order.status = "paid"
51+
52+
class CreditPaymentProcessor(PaymentProcessor):
53+
54+
def __init__(self, security_code):
55+
self.security_code = security_code
56+
57+
def pay(self, order):
58+
print("Processing credit payment type")
59+
print(f"Verifying security code: {self.security_code}")
60+
order.status = "paid"
61+
62+
class PaypalPaymentProcessor(PaymentProcessor):
63+
64+
def __init__(self, email_address, authorizer: SMSAuthorizer):
65+
self.email_address = email_address
66+
self.authorizer = authorizer
67+
68+
def pay(self, order):
69+
if not self.authorizer.is_authorized():
70+
raise Exception("Not authorized")
71+
print("Processing paypal payment type")
72+
print(f"Using email address: {self.email_address}")
73+
order.status = "paid"
74+
75+
76+
order = Order()
77+
order.add_item("Keyboard", 1, 50)
78+
order.add_item("SSD", 1, 150)
79+
order.add_item("USB cable", 2, 5)
80+
81+
print(order.total_price())
82+
authorizer = SMSAuthorizer()
83+
# authorizer.verify_code(465839)
84+
processor = PaypalPaymentProcessor("[email protected]", authorizer)
85+
processor.pay(order)

0 commit comments

Comments
 (0)