Рубрики
Без рубрики

Фабрика и абстракция в Python

Python кажется очень интересным языком, где все в вашей руке. Вы можете написать код, который W … Tagged с Python.

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”