Command mode and iterator pattern | Python theme on 13/30
Writing in the front
This article is participating in Python Theme Month. See the link for details
This month is Python Activity month, and I decided to try out the daily and random questions in Python for 30 days. Then if I have the energy for the weekend, I’d like to play around with this Python-Patterns
Design mode for me is more learning than my personal experience summary, so I am likely to understand the partial, if there is a boss to see, please timely point out that I choose to write some personal things in Nuggets because of the higher quality of the article here, I do not hope that the later to see these articles are misleading.
Command mode
from typing import Union
class HideFileCommand:
""" A command to hide a file given its name """
def __init__(self) - >None:
# an array of files hidden, to undo them as needed
self._hidden_files = []
def execute(self, filename: str) - >None:
print(f"hiding {filename}")
self._hidden_files.append(filename)
def undo(self) - >None:
filename = self._hidden_files.pop()
print(f"un-hiding {filename}")
class DeleteFileCommand:
""" A command to delete a file given its name """
def __init__(self) - >None:
# an array of deleted files, to undo them as needed
self._deleted_files = []
def execute(self, filename: str) - >None:
print(f"deleting {filename}")
self._deleted_files.append(filename)
def undo(self) - >None:
filename = self._deleted_files.pop()
print(f"restoring {filename}")
class MenuItem:
""" The invoker class. Here it is items in a menu. """
def __init__(self, command: Union[HideFileCommand, DeleteFileCommand]) - >None:
self._command = command
def on_do_press(self, filename: str) - >None:
self._command.execute(filename)
def on_undo_press(self) - >None:
self._command.undo()
def main() :
""" >>> item1 = MenuItem(DeleteFileCommand()) >>> item2 = MenuItem(HideFileCommand()) # create a file named `test-file` to work with >>> test_file_name = 'test-file' # deleting `test-file` >>> item1.on_do_press(test_file_name) deleting test-file # restoring `test-file` >>> item1.on_undo_press() restoring test-file # hiding `test-file` >>> item2.on_do_press(test_file_name) hiding test-file # un-hiding `test-file` >>> item2.on_undo_press() un-hiding test-file "" "
if __name__ == "__main__":
import doctest
doctest.testmod()
Copy the code
Iterator pattern
def count_to(count) :
"""Counts by word numbers, up to a maximum of five"""
numbers = ["one"."two"."three"."four"."five"]
yield from numbers[:count]
# Test the generator
def count_to_two() - >None:
return count_to(2)
def count_to_five() - >None:
return count_to(5)
def main() :
""" # Counting to two... >>> for number in count_to_two(): ... print(number) one two # Counting to five... >>> for number in count_to_five(): ... print(number) one two three four five """
if __name__ == "__main__":
import doctest
doctest.testmod()
Copy the code
summary
reference
- There is no