Skip to main content

Define real, inheritable, and efficient Python classes using variable annotations

Project description

typedobject

Define real, inheritable, and efficient Python classes using TypedDict-like syntax.

Getting started

Install from pip.

python -m pip install typedobject

Then, annotate your class with typedobject and declare its member fields using variable annotations.

from typedobject import typedobject

@typedobject
class Point:
    x: int
    y: int

Then construct the object using either positional or keyword arguments.

pt1 = Point(10, 20)
pt2 = Point(x=10, y=20)
assert pt1 == pt2

You can define methods, including __init__.

@typedobject
class Rectangle:
    pt1: Point
    pt2: Point

    def __init__(self, x1, y1, x2, y2):
        self.pt1 = Point(x1, y1)
        self.pt2 = Point(x2, y2)

    def area(self):
        return (self.pt2.x - self.pt1.x) * (self.pt2.y - self.pt1.y)

rect = Rectangle(1, 1, 3, 3)
assert rect.area() == 4

Unlike TypedDict, the defined classes are actually fresh new classes, not dicts.

assert isinstance(rect, Rectangle)
assert not isinstance(rect, Point)

Inheritance works just fine.

@typedobject
class RoundedRect(Rectangle):
    corner_radius: int

rr = RoundedRect(Point(1, 1), Point(3, 3), 1)

Note that the derived class overrides __init__, unless you use .no_init.

@typedobject.no_init
class RoundedRect2(Rectangle):
    corner_radius: int

rr = RoundedRect2(1, 1, 3, 3)
assert not hasattr(rr, 'corner_radius')

Typed object classes, unlike dataclass, specify __slots__, which makes access to attributes faster and makes objects take less memory, but prevents adding new fields dynamically.

They also prevent multiple inheritance.

# raises TypeError
class RectangleWithAPoint(Rectangle, Point):
    pass

You can, however, inject mixins.

class TwoDObjectMixin:
    def area(self):
        return self.width() * self.height()

@typedobject
class Rectangle2(TwoDObjectMixin):
    pt1: Point
    pt2: Point

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

typedobject-1.1.1.tar.gz (7.9 kB view details)

Uploaded Source

Built Distribution

typedobject-1.1.1-py3-none-any.whl (6.9 kB view details)

Uploaded Python 3

File details

Details for the file typedobject-1.1.1.tar.gz.

File metadata

  • Download URL: typedobject-1.1.1.tar.gz
  • Upload date:
  • Size: 7.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.8.2

File hashes

Hashes for typedobject-1.1.1.tar.gz
Algorithm Hash digest
SHA256 7881c7d5994be8b3c5ec2e774ea1d34aa35c8e3787fe352e04b0b8c4a35dee66
MD5 de79232d76855ea4c9760a7c48465964
BLAKE2b-256 cc4679d1674c0adfbc9846b78c05c194cd6bca9c79a807a31785fc5770445c60

See more details on using hashes here.

File details

Details for the file typedobject-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: typedobject-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 6.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.8.2

File hashes

Hashes for typedobject-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e7ff5532c90976c0572a831089d6c9e32c804a10d9d9a49b801258131964d0d2
MD5 1dbb2f9dc41ef40b6e8735de59b09e4c
BLAKE2b-256 8548846f27baec3446a51f0a694dde9c97ce6cc0f14fb700af2fadeebe83ea2d

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