21
21
Creates new object instances by cloning prototype.
22
22
"""
23
23
24
+ from typing import Any , Dict
24
25
25
- class Prototype :
26
26
27
- value = "default"
27
+ class Prototype :
28
+ def __init__ (self , value : str = "default" , ** attrs : Any ) -> None :
29
+ self .value = value
30
+ self .__dict__ .update (attrs )
28
31
29
- def clone (self , ** attrs ) :
32
+ def clone (self , ** attrs : Any ) -> None :
30
33
"""Clone a prototype and update inner attributes dictionary"""
31
34
# Python in Practice, Mark Summerfield
32
- obj = self .__class__ ()
35
+ # copy.deepcopy can be used instead of next line.
36
+ obj = self .__class__ (** self .__dict__ )
33
37
obj .__dict__ .update (attrs )
34
38
return obj
35
39
@@ -38,33 +42,36 @@ class PrototypeDispatcher:
38
42
def __init__ (self ):
39
43
self ._objects = {}
40
44
41
- def get_objects (self ):
45
+ def get_objects (self ) -> Dict [ str , Prototype ] :
42
46
"""Get all objects"""
43
47
return self ._objects
44
48
45
- def register_object (self , name , obj ) :
49
+ def register_object (self , name : str , obj : Prototype ) -> None :
46
50
"""Register an object"""
47
51
self ._objects [name ] = obj
48
52
49
- def unregister_object (self , name ) :
53
+ def unregister_object (self , name : str ) -> None :
50
54
"""Unregister an object"""
51
55
del self ._objects [name ]
52
56
53
57
54
- def main ():
58
+ def main () -> None :
55
59
"""
56
60
>>> dispatcher = PrototypeDispatcher()
57
61
>>> prototype = Prototype()
58
62
59
63
>>> d = prototype.clone()
60
64
>>> a = prototype.clone(value='a-value', category='a')
61
- >>> b = prototype .clone(value='b-value', is_checked=True)
65
+ >>> b = a .clone(value='b-value', is_checked=True)
62
66
>>> dispatcher.register_object('objecta', a)
63
67
>>> dispatcher.register_object('objectb', b)
64
68
>>> dispatcher.register_object('default', d)
65
69
66
70
>>> [{n: p.value} for n, p in dispatcher.get_objects().items()]
67
71
[{'objecta': 'a-value'}, {'objectb': 'b-value'}, {'default': 'default'}]
72
+
73
+ >>> print(b.category, b.is_checked)
74
+ a True
68
75
"""
69
76
70
77
0 commit comments