Python3.7 provides dataclasses module for faster class creation (PEP 557). Unfortunately there's no support for __slots__. If you want to create more memory efficient instances, you need to do it by yourself or use dataslots.dataslots decorator.
@dataslots
@dataclass
class Point2D:
x: int
y: int
As described in docs, in derived class __dict__ is created, because base class does not have __slots__. Slots are created from all defined properties (returned by dataclasses.fields() function).
@dataclass
class Base:
a: int
@dataslots
@dataclass
class Derived(Base):
c: int
d: int
@dataslots(add_dict=True)
@dataclass
class Point2D:
x: int
y: int
point = Point2D(10, 20)
point.length = math.sqrt(point.x ** 2 + point.y ** 2)
@dataslots(add_weakref=True)
@dataclass
class Point2D:
x: int
y: int
point = Point2D(10, 20)
r = weakref.ref(point)
With __slots__ it's possible to define read-only class variables. When using dataclasses you cannot provide type for attribute or use typing.ClassVar to declare one.
@dataslots
@dataclass
class A:
x = 5
y: ClassVar[set] = set()
Because of an issue 36424 you need custom __setstate__ method. In dataslots there is implemented default version and it is used if decorated class has no __getstate__ and __setstate__ function declared.