Python кажется очень интересным языком, где все в вашей руке. Вы можете написать код, который работает или пишет красивый код с популярными и любимыми концепциями, такими как твердый, чистый код и шаблоны проектирования. Я не сделаю этот пост долго, и я постараюсь написать краткие концепции о Python от. В этом посте я расскажу о Фабрика шаблон , как мы можем реализовать, что в Python и как создавать Абстракция сделать все проще.
Допустим, у нас есть аудиоплеер, и мы можем играть в форматы WAV и MP3. Так основано на параметре волновать
или mp3
Мы загружаем файлы и играем их. Давайте сначала сделаем интерфейс.
from abc import ABC, abstractmethod class AudioPlayer(ABC): @abstractmethod def load(self, file: str) -> (str): pass @abstractmethod def play(self) -> (str): pass
Я использовал ABC
Пакет для реализации формальной концепции интерфейса. @abstractmethod
Декоратор подразумевает, что эти методы должны быть переопределены бетонными классами. Итак, давайте сделаем игроками сейчас.
class Mp3Player(AudioPlayer): def __init__(self): self.format = "mp3" self.file = None def load(self, file: str) -> (str): self.file = file return f"Loading {self.format} file named {file}" def play(self) -> (str): return f"playing {self.file}" class WavPlayer(AudioPlayer): def __init__(self): self.format = "wav" self.file = None def load(self, file: str) -> (str): self.file = file return f"Loading {self.format} file named {file}" def play(self) -> (str): return f"playing {self.file}"
Так что у нас есть Мп3-плеер
и Волшебник
. Они реализуют оба метода нагрузка
и Играть
Отказ Эти два класса здесь идентичны, но в реализации реальной жизни нагрузка должна быть иной, может быть, игра. Теперь пришло время создать завод. Вот волшебство питона приходит в игру!
player_factory = { 'mp3': Mp3Player, 'wav': WavPlayer }
Это потрясающе! Вы можете отобразить классы в словарях, так просто! На других языках вам, возможно, придется написать несколько случаев переключателя или если-else. Теперь вы можете напрямую использовать этот завод, чтобы вызвать нашу нагрузку и играть. Это называется Диспетчер в питоне.
mp3_player = player_factory['mp3']() print(mp3_player.load("creep.mp3")) print(mp3_player.play()) wav_player = player_factory['wav']() print(wav_player.load("that's_life.wav")) print(wav_player.play())
Посмотрите, как мы можем инициализировать класс на основе параметра! mp3_player ['mp3'] ()
– Это действительно круто. Так что весь код выглядит так –
from abc import ABC, abstractmethod class AudioPlayer(ABC): @abstractmethod def load(self, file: str) -> (str): raise NotImplementedError @abstractmethod def play(self) -> (str): raise NotImplementedError class Mp3Player(AudioPlayer): def __init__(self): self.format = "mp3" self.file = None def load(self, file: str) -> (str): self.file = file return f"Loading {self.format} file named {file}" def play(self) -> (str): return f"playing {self.file}" class WavPlayer(AudioPlayer): def __init__(self): self.format = "wav" self.file = None def load(self, file: str) -> (str): self.file = file return f"Loading {self.format} file named {file}" def play(self) -> (str): return f"playing {self.file}" player_factory = { 'mp3': Mp3Player, 'wav': WavPlayer } mp3_player = player_factory['mp3']() print(mp3_player.load("creep.mp3")) print(mp3_player.play()) wav_player = player_factory['wav']() print(wav_player.load("that's_life.wav")) print(wav_player.play())
Теперь вы можете спросить, что если пользователь дает MP4
в Player_Factory
Инициализация, что произойдет. Хорошо, код будет сбой. Здесь мы можем сделать абстракцию и скрывать всю сложность создания класса, а также проверяя параметры.
class AudioPlayerFactory: player_factory = { 'mp3': Mp3Player, 'wav': WavPlayer } @staticmethod def make_player(format: str): if format not in AudioPlayerFactory.player_factory: raise Exception(f"{format} is not supported") return AudioPlayerFactory.player_factory[format]()
Теперь мы можем просто использовать AudioPlayerFactory
загрузить и играть.
mp3_player = AudioPlayerFactory.make_player('mp3') print(mp3_player.load("creep.mp3")) print(mp3_player.play()) wav_player = AudioPlayerFactory.make_player('wav') print(wav_player.load("that's_life.wav")) print(wav_player.play()) mp4_player = AudioPlayerFactory.make_player('mp4') print(mp4_player.load("what_a_wonderful_life.mp4")) print(mp4_player.play())
Вы увидите исключение для файла MP4. Вы можете справиться с этим по-своему. Так что новый код –
from abc import ABC, abstractmethod class AudioPlayer(ABC): @abstractmethod def load(self, file: str) -> (str): raise NotImplementedError @abstractmethod def play(self) -> (str): raise NotImplementedError class Mp3Player(AudioPlayer): def __init__(self): self.format = "mp3" self.file = None def load(self, file: str) -> (str): self.file = file return f"Loading {self.format} file named {file}" def play(self) -> (str): return f"playing {self.file}" class WavPlayer(AudioPlayer): def __init__(self): self.format = "wav" self.file = None def load(self, file: str) -> (str): self.file = file return f"Loading {self.format} file named {file}" def play(self) -> (str): return f"playing {self.file}" class AudioPlayerFactory: player_factory = { 'mp3': Mp3Player, 'wav': WavPlayer } @staticmethod def make_player(format: str): if format not in AudioPlayerFactory.player_factory: raise Exception(f"{format} is not supported") return AudioPlayerFactory.player_factory[format]() mp3_player = AudioPlayerFactory.make_player('mp3') print(mp3_player.load("creep.mp3")) print(mp3_player.play()) wav_player = AudioPlayerFactory.make_player('wav') print(wav_player.load("that's_life.wav")) print(wav_player.play()) mp4_player = AudioPlayerFactory.make_player('mp4') print(mp4_player.load("what_a_wonderful_life.mp4")) print(mp4_player.play())
Надеюсь, это поможет вам разработать фабрики 😀
Оригинал: “https://dev.to/ananto30/factory-pattern-abstraction-in-python-169g”