Как поделиться экземпляром класса по всему проекту? - PullRequest
2 голосов
/ 06 февраля 2020

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

Примерно так:

Библиотека

class Lib():

  def __init__(self, msg):
    self.msg = msg

  def print_msg():
    print(self.msg)

submod1

from lib import Lib

def test():
  # something like this
  Lib.print_msg()

submod2

from lib import Lib

def test():
  # something like this
  Lib.print_msg()

Основной пользовательский

from lib import Lib:
import submod1, submod2

lib = Lib('message')

submod1.test()
submod2.test()

Выход

message
message

Ответы [ 2 ]

3 голосов
/ 06 февраля 2020

Похоже, что класс Singleton подойдет для вашего случая использования. Существует несколько способов реализации одноэлементного класса в python. Обратитесь к этому ответу для более подробного объяснения.

Хотя для вашего случая использования вы можете сделать что-то вроде этого:

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            # don't want __init__ to be called every time
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]


class Lib(metaclass=Singleton):
    def __init__(self, msg):
        self.msg = msg

    def print_msg():
        print(self.msg)

submod1

from lib import Lib

    def test():
        Lib().print_msg()

основной файл

from lib import Lib:
import submod1, submod2

    lib = Lib('message')

    submod1.test()
    submod2.test()
1 голос
/ 06 февраля 2020

Lib.py:

class Lib:
    msg = ""
    __init__ = None

    @classmethod
    def print_msg(cls):
        print(cls.msg)

Может быть что-то подобное?

Первое использование:

Lib.msg = "abc"
Lib.print_msg()

Второе использование:

Lib.print_msg()
...