mono_1.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. '''
  2. Моносостояние - паттерн, который позволяет получить экземпляры
  3. клсса с одним общим набором атрибутов
  4. '''
  5. class SimpleCat:
  6. def __init__(self, breed, color):
  7. self.breed = breed
  8. self.color = color
  9. def test_1():
  10. cat1 = SimpleCat('pers', 'black')
  11. cat2 = SimpleCat('siam', 'gray')
  12. print(cat1.__dict__) # {'breed': 'pers', 'color': 'black'}
  13. print(cat2.__dict__) # {'breed': 'siam', 'color': 'gray'}
  14. print(id(cat1.__dict__), id(cat2.__dict__)) # разные ссылки на атрибут __dict__
  15. class Cat:
  16. __shared_attr = { # Формирование единого словаря атрибутов класса
  17. 'breed': 'pers', # При изменении значений - эти значения обновятся
  18. 'color': 'black' # во всех экземплярах класса
  19. }
  20. def __init__(self):
  21. self.__dict__ = Cat.__shared_attr # Подменяем в инициализации __dict__
  22. # ссылкой на созданный моно-словарь
  23. def test_2():
  24. cat1 = Cat()
  25. cat2 = Cat()
  26. print(cat1.__dict__) # {'breed': 'pers', 'color': 'black'}
  27. print(cat2.__dict__) # {'breed': 'pers', 'color': 'black'}
  28. print(id(cat1.__dict__), id(cat2.__dict__)) # одинаковые ссылки
  29. cat1.breed, cat1.color = 'pers', 'white' # Меняем атрибуты у cat1
  30. print('cat1:', cat1.__dict__) # {'breed': 'pers', 'color': 'white'}
  31. print('cat2:', cat2.__dict__) # {'breed': 'pers', 'color': 'white'}
  32. cat2.breed, cat2.color = 'siam', 'gray' # Меняем атрибуты у cat2
  33. print('cat1:', cat1.__dict__) # {'breed': 'siam', 'color': 'gray'}
  34. print('cat2:', cat2.__dict__) # {'breed': 'siam', 'color': 'gray'}
  35. '''
  36. Атрибут weight появится во всех экземплярах класса Cat
  37. '''
  38. def test_3():
  39. cat1 = Cat()
  40. cat2 = Cat()
  41. cat1.weight = 5 # Добавляем параметр в ЭК
  42. print('cat1:', cat1.__dict__) # {'breed': 'pers', 'color': 'black', 'weight': 5}
  43. print('cat2:', cat2.__dict__) # {'breed': 'pers', 'color': 'black', 'weight': 5}
  44. def main():
  45. # test_2()
  46. test_3()
  47. if __name__ == '__main__':
  48. main()