'''
Моносостояние - паттерн, который позволяет получить экземпляры
клсса с одним общим набором атрибутов
'''

class SimpleCat:
    def __init__(self, breed, color):
        self.breed = breed
        self.color = color

def test_1():
    cat1 = SimpleCat('pers', 'black')
    cat2 = SimpleCat('siam', 'gray')
    print(cat1.__dict__)  # {'breed': 'pers', 'color': 'black'}
    print(cat2.__dict__)  # {'breed': 'siam', 'color': 'gray'}
    print(id(cat1.__dict__), id(cat2.__dict__)) # разные ссылки на атрибут __dict__


class Cat:
    __shared_attr = {  # Формирование единого словаря атрибутов класса
        'breed': 'pers',  # При изменении значений - эти значения обновятся
        'color': 'black'  # во всех экземплярах класса
    }

    def __init__(self):
        self.__dict__ = Cat.__shared_attr  # Подменяем в инициализации __dict__
                                           # ссылкой на созданный моно-словарь

def test_2():
    cat1 = Cat()
    cat2 = Cat()
    print(cat1.__dict__)  # {'breed': 'pers', 'color': 'black'}
    print(cat2.__dict__)  # {'breed': 'pers', 'color': 'black'}
    print(id(cat1.__dict__), id(cat2.__dict__))  # одинаковые ссылки

    cat1.breed, cat1.color = 'pers', 'white'  # Меняем атрибуты у cat1
    print('cat1:', cat1.__dict__)  # {'breed': 'pers', 'color': 'white'}
    print('cat2:', cat2.__dict__)  # {'breed': 'pers', 'color': 'white'}

    cat2.breed, cat2.color = 'siam', 'gray'  # Меняем атрибуты у cat2
    print('cat1:', cat1.__dict__)  # {'breed': 'siam', 'color': 'gray'}
    print('cat2:', cat2.__dict__)  # {'breed': 'siam', 'color': 'gray'}

'''
Атрибут weight появится во всех экземплярах класса Cat
'''
def test_3():
    cat1 = Cat()
    cat2 = Cat()
    cat1.weight = 5  # Добавляем параметр в ЭК
    print('cat1:', cat1.__dict__)  # {'breed': 'pers', 'color': 'black', 'weight': 5}
    print('cat2:', cat2.__dict__)  # {'breed': 'pers', 'color': 'black', 'weight': 5}


def main():
    # test_2()
    test_3()

if __name__ == '__main__':
    main()