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 dict
s.
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
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
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7881c7d5994be8b3c5ec2e774ea1d34aa35c8e3787fe352e04b0b8c4a35dee66 |
|
MD5 | de79232d76855ea4c9760a7c48465964 |
|
BLAKE2b-256 | cc4679d1674c0adfbc9846b78c05c194cd6bca9c79a807a31785fc5770445c60 |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | e7ff5532c90976c0572a831089d6c9e32c804a10d9d9a49b801258131964d0d2 |
|
MD5 | 1dbb2f9dc41ef40b6e8735de59b09e4c |
|
BLAKE2b-256 | 8548846f27baec3446a51f0a694dde9c97ce6cc0f14fb700af2fadeebe83ea2d |