注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
x
本帖最后由 - # design for linux find
- from enum import Enum
- from abc import ABCMeta, abstractmethod
- from collections import deque
- class FileType(Enum):
- video = 1
- image = 2
- text = 3
- other = 4
- class File:
- # children is list of File
- def __init__(self, name: str, size: int, type=None, is_directory=False, children=[]):
- self.name = name
- self.size = size
- self.type = type
- self.is_directory = is_directory
- self.children = children
- # build abstract class
- class Filter(metaclass=ABCMeta):
- @abstractmethod
- def apply_filter(self, file: File):
- pass
- # extend previous abstract class Filter
- class MinSizeFilter(Filter):
- def __init__(self, size):
- self.size = size
- def apply_filter(self, file):
- return file.size >= self.size
- class TypeFilter(Filter):
- def __init__(self, type):
- self.type = type
- def apply_filter(self, file):
- return file.type == self.type
- # build FindCommand class
- class FindCommand:
- def __init__(self, type=None, min_size=0):
- self.min_size_filter = MinSizeFilter(min_size)
- self.type_filter = TypeFilter(type)
- self.file_lst = []
- def get_required_file_list(self, file):
- queue = deque([file])
- while queue:
- cur_file = queue.popleft()
- if self.min_size_filter.apply_filter(cur_file) and self.type_filter.apply_filter(cur_file):
- self.file_lst.append(cur_file.name)
- for child in cur_file.children:
- queue.append(child)
- return self.file_lst
- file1 = File(name="photo1", size=6, type=FileType.image)
- print(file1.size)
- print(file1.type)
- min_size_filter_5 = MinSizeFilter(5)
- print(min_size_filter_5.apply_filter(file1))
- type_filter_image = TypeFilter(FileType.image)
- print(type_filter_image.apply_filter(file1))
- file2 = File(name="photo2", size=4, type=FileType.image)
- file3 = File(name="video1", size=4, type=FileType.video)
- file4 = File(name="photo3", size=6, type=FileType.image)
- directory1 = File(name="dir1", size=20, is_directory=True, children=[file1, file2, file3, file4])
- find_image_larger_than_5 = FindCommand(type=FileType.image, min_size=5)
- print(find_image_larger_than_5.get_required_file_list(directory1))
复制代码
|