TelenkovDmitry 6 kuukautta sitten
vanhempi
commit
b34caa3807
2 muutettua tiedostoa jossa 176 lisäystä ja 0 poistoa
  1. 154 0
      courses/python_oop/meta/meta_3.py
  2. 22 0
      courses/python_oop/meta/type.py

+ 154 - 0
courses/python_oop/meta/meta_3.py

@@ -0,0 +1,154 @@
+'''
+Паттерн Singleton
+Паттерн гарантирует, что класс имеет только один экземпляр, 
+предоставляет глобальную точку доступа к этому экзеемпляру.
+Этот экземпляр обычно предоставляет доступ к определенным 
+ресурсам или слажбам, таким как база данных, файловая система
+или любая другая общая ресурсоемкая операция.
+'''
+
+class Singleton:
+    _instance = None
+
+    def __new__(cls):
+        if not cls._instance:
+            cls.instance = super(Singleton, cls).__new__(cls)
+        return cls._instance
+
+def test_1():
+    instance_1 = Singleton()
+    instance_2 = Singleton()
+
+    print(id(instance_1))
+    print(id(instance_2))
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class AppSettings:
+    __instance = None
+
+    def __new__(cls):
+        if not cls.__instance:
+            cls.__instance = super(AppSettings, cls).__new__(cls)
+            # Логика инициализации настроек (может быть сложной)
+            cls.__instance.initialize_settings()
+        return cls.__instance
+
+    def initialize_settings(self):
+        # Логика инициализации настроек
+        self.app_name = 'MyApp 1.0'
+        self.debug_mode = False
+        self.log_level = 'INFO'
+
+    @staticmethod
+    def get_app():
+        if not AppSettings.__instance:
+            AppSettings.__new__(AppSettings)
+        return AppSettings.__instance
+
+
+def test_2():
+    app_settings_1 = AppSettings.get_app()
+    app_settings_2 = AppSettings()
+
+    print(app_settings_1 is app_settings_2) # Выдает True
+
+    print(app_settings_1.app_name)
+    print(app_settings_2.app_name)
+    print(app_settings_1.debug_mode)
+    print(app_settings_2.debug_mode)
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class Logger:
+    __instance = None
+
+    def __new__(cls):
+        if not cls.__instance:
+            cls.__instance = super(Logger, cls).__new__(cls)
+            cls.log_level = 'INFO'
+        return cls.__instance
+
+    @staticmethod
+    def set_level(level):
+        if not Logger.__instance:
+            raise ValueError('The instance has not created')
+        Logger.log_level = level
+
+    def new_method(self, level):
+        return level
+
+    @staticmethod
+    def get_logger():
+        if not Logger.__instance:
+            Logger.__new__(Logger)
+        return Logger.__instance
+
+def test_3():
+    logger_1 = Logger.get_logger()
+    print(logger_1.log_level)  # Выведет "INFO"
+    Logger.set_level("DEBUG")
+    print(logger_1.log_level)  # Выведет "DEBUG"
+
+    logger_2 = Logger.get_logger()
+    print(logger_2.log_level)  # Выведет "DEBUG"
+    print(logger_2 is logger_1)
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+'''
+def singleton(func):
+    def wrapper():
+        original_result = func()
+        modified_result = original_result + 1
+        return modified_result
+    return wrapper
+'''
+
+def singleton(cls):
+    foo = None
+    def wrapper():
+        nonlocal foo
+        if foo is None:
+            foo = cls()
+        return foo
+    return wrapper
+
+@singleton
+class Logger:
+    pass
+
+
+@singleton
+class AppConfig:
+    pass
+
+
+@singleton
+class SMTPServerConfig:
+    pass
+
+def test_4():
+    log = Logger()
+    app_conf = AppConfig()
+    app_conf_2 = AppConfig()
+    smtp_conf = SMTPServerConfig()
+    assert log is Logger()
+    assert app_conf is app_conf_2
+    assert smtp_conf is SMTPServerConfig()
+    assert log is not app_conf
+    assert log is not smtp_conf
+    assert app_conf is not smtp_conf
+    print('Good')
+
+
+
+
+def main():
+    # test_1()
+    # test_2()
+    # test_3()
+    test_4()
+
+if __name__ == '__main__':
+    main()

+ 22 - 0
courses/python_oop/meta/type.py

@@ -0,0 +1,22 @@
+'''
+Любой класс относится к типу данных type и является его экземпляром.
+'''
+class Person:
+    def __init__(self, name, age):
+        self.name = name
+        self.age = age
+
+    def greeting(self):
+        return f'Hi, I am {self.name}. I am {self.age} years old'
+
+def test_1():
+    print(isinstance(Person, type))
+    print(type(Person))
+
+
+def main():
+    test_1()
+
+if __name__ == '__main__':
+    main()
+