"""Простая фабрика - это паттерн, позволяющий задать альтернативные
конструкторы класса за счет использования методов класса."""
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)