mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2024-11-22 17:47:02 +03:00
53 lines
1.2 KiB
Python
53 lines
1.2 KiB
Python
"""Custom provider example."""
|
|
|
|
from dependency_injector import containers, providers
|
|
|
|
|
|
class CustomFactory(providers.Provider):
|
|
|
|
__slots__ = ('_factory',)
|
|
|
|
def __init__(self, provides, *args, **kwargs):
|
|
self._factory = providers.Factory(provides, *args, **kwargs)
|
|
super().__init__()
|
|
|
|
def __deepcopy__(self, memo):
|
|
copied = memo.get(id(self))
|
|
if copied is not None:
|
|
return copied
|
|
|
|
copied = self.__class__(
|
|
self._factory.provides,
|
|
*providers.deepcopy(self._factory.args, memo),
|
|
**providers.deepcopy(self._factory.kwargs, memo),
|
|
)
|
|
self._copy_overridings(copied, memo)
|
|
|
|
return copied
|
|
|
|
@property
|
|
def related(self):
|
|
"""Return related providers generator."""
|
|
yield from [self._factory]
|
|
yield from super().related
|
|
|
|
def _provide(self, args, kwargs):
|
|
return self._factory(*args, **kwargs)
|
|
|
|
|
|
class Container(containers.DeclarativeContainer):
|
|
|
|
factory = CustomFactory(object)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
container = Container()
|
|
|
|
object1 = container.factory()
|
|
assert isinstance(object1, object)
|
|
|
|
object2 = container.factory()
|
|
assert isinstance(object1, object)
|
|
|
|
assert object1 is not object2
|