Задать вопрос
  • FastAPI Prometheus_fastapi_instrumentator где мне следует разместить?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    где мне следует разместить Prometheus_instrumentator — внутри или снаружи lifespan?

    Снаружи lifespan, чтобы он был доступен на протяжении всего жизненного цикла приложения. Но instrumentator.instrument нужно вызывать после создания экземпляра fastapi, но до запуска самого приложения.
    Ответ написан
    1 комментарий
  • В чем суть self?

    @fireSparrow
    Если кратко и по простому, то дело обстоит так:

    Обычно класс создают для того, чтобы потом создать некоторое количество экземпляров этого класса.
    При написании класса нужно как-то указать, что какие-то манипуляции нужно производить именно над конкретными экземплярами, а не над самим классом.

    Для этого в функциях (кроме некоторых исключений) первым аргументом пишут имя (по традиции это как раз слово "self", хотя на самом деле там можно указать любое корректное имя). В результате, когда в функции интерпретатор видит имя self, он понимает, что речь идёт именно об одном конкретном объекте класса.

    Пример:
    class A:
      
      # У класса есть атрибут "x"
      x = 1
      
      def change_one(self, value):
        # Эта функция меняет атрибут "x" только у того экземпляра класса,
        # для которого она вызвана
        self.x = value
      
      def change_all(self, value):
        # Эта функция меняет атрибут "x" у самого класса
        # Изменение отразится на всех экземплярах, у которых нет своего атрибута "x"
        A.x = value
    
    
    a1 = A()
    a2 = A()
    a3 = A()
    
    print(a1.x, a2.x, a3.x)
    # Выведет: 1 1 1
    # На самом деле, у экземпляров пока нет своего атрибута "x",
    # но они получают его значение из класса
    
    a1.change_one(5)
    
    print(a1.x, a2.x, a3.x)
    # Выведет: 5 1 1
    # Теперь у а1 есть свой атрибут x, потому что функция change_one через self
    # создала его только для того экземпляра, для которого её вызвали
    # a2 и a3 по прежнему не имеют своего атрибута "x" и получают его значение из класса
    
    a2.change_all(2)
    
    print(a1.x, a2.x, a3.x)
    # Выведет: 5 2 2
    # Изменился атрибут класса, и поэтому значение изменилось для всех элементов,
    # которые не имеют своего атрибута "x", а вынуждены брать его из класса
    
    a1.change_all(7)
    
    print(a1.x, a2.x, a3.x)
    # Выведет: 5 7 7
    # Совершенно всё равно, из какого экземпляра вы запускаете change_all.
    # В этой функции не используется self (в отличие от change_one),
    # а значит результат её вызова никак не связан с конкретным экземпляром
    Ответ написан
    1 комментарий