Python

Паттерн Simple Factory

"""Простая фабрика - это паттерн, позволяющий задать альтернативные
конструкторы класса за счет использования методов класса."""

import re


class Money:
    def __init__(self, dollars, cents):
        self.dollars = dollars
        self.cents = cents

    @classmethod
    def from_pennies(cls, total_cents):
        dollars = total_cents // 100
        cents = total_cents % 100
        return cls(dollars, cents)

    @classmethod
    def from_string(cls, amount):
        match = re.search(
            r'^\$(?P<dollars>\d+)\.(?P<cents>\d\d)$', amount)
        if match is None:
            raise ValueError(f"Invalid amount: {amount}")
        dollars = int(match.group('dollars'))
        cents = int(match.group('cents'))
        return cls(dollars, cents)


# Можно использовать класс, передавая в него значения атрибутов напрямую
money_from_ints = Money(234, 45)
print(money_from_ints.dollars)
print(money_from_ints.cents)
print()

# А можно через вызов методов класса
# Методы класса вызываются на самом классе, а не на его экземплярах
money_from_string = Money.from_string('$140.85')
print(money_from_string.dollars)
print(money_from_string.cents)
print()

money_from_pennies = Money.from_pennies(1049)
print(money_from_pennies.dollars)
print(money_from_pennies.cents)

Вставить формулу как
Блок
Строка
Дополнительные настройки
Цвет формулы
Цвет текста
#333333
Используйте LaTeX для набора формулы
Предпросмотр
\({}\)
Формула не набрана
Вставить