A tool for automated delegation with abstract base classes
Project description
abc-delegation
A tool for automated delegation with abstract base classes.
This metaclass enables creation of delegating classes inheriting from an abstract base class.
This technique is impossible with regular __getattr__
approach for delegation,
so normally, you would have to define every delegated method explicitly.
Not any more
The metaclasses also enable optional validation of the delegate attributes to ensure they have all of the methods required by the parent object.
Installation:
pip install abc-delegation
Basic usage:
from abc import ABCMeta
from abc_delegation import delegation_metaclass
class A(metaclass=ABCMeta):
@abstractmethod
def bar(self):
pass
@abstractmethod
def foo(self):
pass
class B:
def bar(self):
return "B bar"
def foo(self):
return "B foo"
class C(A, metaclass=delegation_metaclass("my_delegate")):
def __init__(self, b):
self.my_delegate = b
def foo(self):
return "C foo"
c = C(B())
assert c.foo() == "C foo"
assert c.bar() == "B bar"
Validation
class A(metaclass=ABCMeta):
@abstractmethod
def bar(self):
pass
@abstractmethod
def foo(self):
pass
class B:
pass
# validation is on by default
class C(A, metaclass=delegation_metaclass("_delegate")):
def __init__(self, b):
self._delegate = b
def foo(self):
return "C foo"
C(B())
# Trying to instantiate C class with B delegate which is missing 'bar' method
# Validation raises an error:
# TypeError: Can't instantiate bar: missing attribute bar in the delegate attribute _delegate
Multiple delegates:
from abc import ABCMeta
from abc_delegation import multi_delegation_metaclass
class A(metaclass=ABCMeta):
@abstractmethod
def bar(self):
pass
@abstractmethod
def foo(self):
pass
@abstractmethod
def baz(self):
pass
class B:
def bar(self):
return "B bar"
def foo(self):
return "B foo"
class X:
def baz(self):
return "X baz"
class C(A, metaclass=multi_delegation_metaclass("_delegate1", "_delegate2")):
def __init__(self, d1, d2):
self._delegate1 = d1
self._delegate2 = d2
def foo(self):
return "C foo"
c = C(B(), X())
assert c.bar() == "B bar"
assert c.foo() == "C foo"
assert c.baz() == "X baz"
Please refer to the unit tests for more examples.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file abc-delegation-0.3.1.tar.gz
.
File metadata
- Download URL: abc-delegation-0.3.1.tar.gz
- Upload date:
- Size: 4.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.0.10 CPython/3.6.10 Linux/5.3.0-1030-aws
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 54cb926be26234689c7b3099cc2535004fb7409fbef5bb9ae1b8b93edcf70870 |
|
MD5 | 3869ad6e8f0ec47aea850c688ca2f729 |
|
BLAKE2b-256 | b62fa08f2c78557db7abaab82d35902d84e2ae9cf65badcb548833e8373f44e1 |
File details
Details for the file abc_delegation-0.3.1-py3-none-any.whl
.
File metadata
- Download URL: abc_delegation-0.3.1-py3-none-any.whl
- Upload date:
- Size: 4.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.0.10 CPython/3.6.10 Linux/5.3.0-1030-aws
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a3989b963a6f9a69a71838338d01a2c05abd6731aeee3c857c0e0f1be1b8fc0e |
|
MD5 | 730de58e8bc16f116ba1d316b2c3cf77 |
|
BLAKE2b-256 | 171d602eb01dfd9f6c739b6da608fc39543fb89a00e2637ce3f102b29e4b309c |