Add-On Class Package
This package provides you with a module that allows you to easily define classes stacked on top of each other and add features to each other, creating a whole new class. You can see an example of this application below.
from add_on_class import AOC
class Parent:
def __init__(self):
self.parrent_property = 1
def parent_functionality(self):
return 10
class Child(Parent):
def __init__(self):
super().__init__()
self.child_property = 2
self.parrent_property = 67
def child_functionality(self):
return 20
class FirstAddOn(AOC):
def __post_init__(self):
self.first_added_property = 3
def first_added_functionality(self):
return 30
def child_functionality(self):
return self.__core.child_functionality(self)*2
class SecondAddOn(AOC):
def __pre_init__(self, pre):
self.pre = pre
def __post_init__(self, post):
self.post = post
self.child_property = 12
def child_functionality(self):
return self.__core.child_functionality(self)*3
added = SecondAddOn(FirstAddOn(Child))(pre=4, post=8)
print(added.parrent_property)
# >>> 67
print(added.child_property)
# >>> 12
print(added.first_added_property)
# >>> 3
print(added.parent_functionality())
# >>> 10
print(added.child_functionality())
# >>> 120
print(added.first_added_functionality())
# >>> 30
print(issubclass(type(added), Parent))
# >>> True
print(added.pre)
# >>> 4
print(added.post)
# >>> 8
- The output of the AOC constructor is a class itself, so you need to get an instance from it again.
- Based on order of calling add-on classes and according to
__pre_init__and__post_init__functions, overrides occur. Use this logic to customize what you need. - Use
self.__coreto access the inner class directly. It's helpful to call a core class function overridden by the add-on one (See the example above).
Another example is here. Note the type of E(D(B)). It is BCoveredByDCoveredByE and is a subclass of B:
from add_on_class import AOC
class A:
def __init__(self):
pass
def main(self):
return "(A.main->"+self.function()+"->A.main.end)"
def function(self):
return "(A.function->A.function.end)"
class B(A):
def main(self):
return "(B.main->"+super().main()+"->B.main.end)"
def function(self):
return "(B.function->B.function.end)"
class D(AOC):
def __post_init__(self):
self.new_attr = 2
def function(self):
return "(D.function->"+self.__core.function(self)+"->D.function.end)"
class E(AOC):
def __pre_init__(self):
self.new_attr = 3
def function(self):
return "(E.function->"+self.__core.function(self)+"->E.function.end)"
e = E(D(B))()
print(e.main())
# >>> (B.main->(A.main->(E.function->(D.function->(B.function->B.function.end)->D.function.end)->E.function.end)->A.main.end)->B.main.end)
print(e.new_attr)
# >>> 2
print(issubclass(type(e), B))
# >>> True
print(E(D(B)).__name__)
# >>> BCoveredByDCoveredByE
- NOTE: We can not add AOC to a class that receives "*args" or "**kwargs" as initialization input.
A class decorator (covering_around) is also available to limit the core class type. See the example below:
from add_on_class import AOC, covering_around
class A:
def __init__(self):
pass
class B(A):
pass
class C:
def __init__(self):
pass
@covering_around([A])
class D(AOC):
def __pre_init__(self):
self.new_attr = 3
def function(self):
return "function"
a = D(A)()
print(a.new_attr)
print(a.function())
b = D(B)()
print(b.new_attr)
print(b.function())
c = D(C)()
Installation
pip install add-on-class
Metadata
Release files for add-on-class 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| add-on-class-0.1.3.tar.gz | 4.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| add_on_class-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 9.2 kB
Release files / add-on-class-0.1.3.tar.gz
| Download URL | add-on-class-0.1.3.tar.gz |
|---|---|
| Size | 4.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a0e6675868696e88d2956ff97fdd4965385538c0d81ffecffff6a479300e22bf
|
|
BLAKE2b-256 checksum How to use checksums |
bae6777ccda11ebc74d3d7f1bac3d4ca782df3c327898ab34b5df6e1b12646ed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.1 importlib_metadata/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.5
|
Release files / add_on_class-0.1.3-py3-none-any.whl
| Download URL | add_on_class-0.1.3-py3-none-any.whl |
|---|---|
| Size | 4.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bf63ddaebaddd60710d0c27adf0d347cd93fd92c30cdb8c40a29bba0100369c4
|
|
BLAKE2b-256 checksum How to use checksums |
ddf41ca0c0595e386090594e58dc25ed277ca7a4044bd85db1c64a10a81dee1e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.1 importlib_metadata/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.5
|