OOP Extensions is a set of utilities for object oriented programming which is missing on Python core libraries.
Project description
What is OOP Extensions ?
OOP Extensions is a set of utilities for object oriented programming which is missing on Python core libraries.
Usage
oop_ext brings a set of object oriented utilities, it supports the concept of interfaces, abstract/overridable methods and more. oop_ext carefully checks that implementations have the same method signatures as the interface it implements and raises exceptions otherwise.
Here’s a simple example showing some nice features:
from oop_ext.interface import Interface, ImplementsInterface
class IDisposable(Interface):
def dispose(self):
"""
Clears this object
"""
def is_disposed(self) -> bool:
"""
Returns True if the object has been cleared
"""
@ImplementsInterface(IDisposable)
class MyObject(Disposable):
def __init__(self):
super().__init__()
self._data = [0] * 100
self._is_disposed = False
def is_disposed(self) -> bool:
return self._is_disposed
def dispose(self):
self._is_disposed = True
self._data = []
If any of the two methods in MyObject are not implemented or have differ signatures than the ones declared in IDisposable, the ImplementsInterface decorator will raise an error during import.
Arbitrary objects can be verified if they implement a certain interface by using IsImplementation:
from oop_ext.interface import IsImplementation
my_object = MyObject()
if IsImplementation(my_object, IDisposable):
# my_object is guaranteed to implement IDisposable completely
my_object.dispose()
Alternatively you can assert that an object implements the desired interface with AssertImplements:
from oop_ext.interface import AssertImplements
my_object = MyObject()
AssertImplements(my_object, IDisposable)
my_object.dispose()
Contributing
For guidance on setting up a development environment and how to make a contribution to oop_ext, see the contributing guidelines.
Release
A reminder for the maintainers on how to make a new release.
Note that the VERSION should follow the semantic versioning as X.Y.Z Ex.: v1.0.5
Create a release-VERSION branch from upstream/master.
Update CHANGELOG.rst.
Push a branch with the changes.
Once all builds pass, push a VERSION tag to upstream.
Merge the PR.
0.4.0 (2019-12-03)
Implementations no longer need to explicitly declare that they declare an interface with @ImplementsInterface: the check is done implicitly (and cached) by AssertImplements and equivalent functions.
0.3.2 (2019-08-22)
Interface and implementation methods can no longer contain mutable defaults, as this is considered a bad practice in general.
Null instances are now hashable.
0.3.1 (2019-08-16)
Fix mismatching signatures when creating “interface stubs” for instances:
foo = IFoo(Foo())
0.3.0 (2019-08-08)
Interfaces now support keyword-only arguments.
0.2.4 (2019-03-22)
Remove FunctionNotRegisteredError exception, which has not been in use for a few years.
0.2.3 (2019-03-22)
Fix issues of ignored exception on nested callback.
0.2.1 (2019-03-14)
Fix issues and remove obsolete code.
0.1.8 (2019-03-12)
First release on PyPI.
Project details
Release history Release notifications | RSS feed
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
Hashes for oop_ext-0.4.0-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7b1c23c096f784df3ca1d075afcdfb38df55ddf4a5568d36e872c5179850a16d |
|
MD5 | 7a81f872e6e42f13b14b8415c05a74a1 |
|
BLAKE2b-256 | 29b7f163d0682353fcaa6dcc782c479142bd834c98f67624c42032573b094b6c |