Skip to main content

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.__core to 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)

Source distribution for add-on-class 0.1.3
File Size Uploaded
add-on-class-0.1.3.tar.gz 4.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for add-on-class 0.1.3
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.1.3 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page