Skip to main content

A lib to define class extendable at runtime.

Project description

CI codecov

Extendable

Extendable is a module that aims to provide a way to define extensible python classes. This module was born out of the need to find a way to allow the definition of modules whose behaviour can be extended by other modules by extending the initial definition of classes at runtime.

Let's define a first python class.

from extendable import ExtendableMeta

class Person(metaclass=ExtendableMeta):

    def __init__(self, name: str):
        self.name = name

    def __repr__(self) -> str:
        return self.name

Someone using the module where the class is defined would need to extend the person definition with a firstname field.

from extendable import ExtendableMeta

class PersonExt(Person, extends=Person):
    def __init__(self, name: str):
        super().__init__(name)
        self._firstname = None

    @property
    def firstname(self) -> str:
        return self._firstname

    @firstname.setter
    def firstname(self, value:str) -> None:
        self._firstname = value

    def __repr__(self) -> str:
        res = super().__repr__()
        return f"{res}, {self.firstname or ''}"

At this time we have defined that PersonExt extends the initial definition of Person. To finalyse the process, we need to instruct the runtime that all our class declarations are done by building the final class definitions and making it available into the current execution context.

from extendable import context, registry

_registry = registry.ExtendableClassesRegistry()
context.extendable_registry.set(_registry)
_registry.init_registry()

Once it's done the Person and PersonExt classes can be used interchangeably into your code since both represent the same class...

p = Person("Mignon")
p.firstname = "Laurent"
print (p)
#> Mignon, Laurent

:warning: This way of extending a predefined behaviour must be used carefully and in accordance with the Liskov substitution principle It doesn't replace others design patterns that can be used to make your code pluggable.

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

extendable-0.0.1.tar.gz (12.6 kB view details)

Uploaded Source

Built Distribution

extendable-0.0.1-py3-none-any.whl (9.5 kB view details)

Uploaded Python 3

File details

Details for the file extendable-0.0.1.tar.gz.

File metadata

  • Download URL: extendable-0.0.1.tar.gz
  • Upload date:
  • Size: 12.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.26.0

File hashes

Hashes for extendable-0.0.1.tar.gz
Algorithm Hash digest
SHA256 8d3f05ed1011440a3f3c8130d1ad6fb925fa9c1c019cc4d36f2b13830ec14d1e
MD5 ad748c0290dfdb12c008423d2f0605ec
BLAKE2b-256 4c9d7a5fc4de13bae31652e07db68e8e5afde63062d49293c283a88091820e79

See more details on using hashes here.

File details

Details for the file extendable-0.0.1-py3-none-any.whl.

File metadata

  • Download URL: extendable-0.0.1-py3-none-any.whl
  • Upload date:
  • Size: 9.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.26.0

File hashes

Hashes for extendable-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 40b936506cf3ea9e141205b8f3af06fa2e367a5e9940960c079ad14432661891
MD5 5753f09175aed086f7d1b77d5a0431cf
BLAKE2b-256 3895b5bc7c83e668dae5b474005d2d66a76fe3966eea8e0379d5a688aad22524

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page