Here's an alternative implementation.
from dataclasses import make_dataclass, fields, dataclass
@dataclass
class A:
a: int
b: int
c: int
d: int
def remove(*exclusions):
def wrapper(cls):
new_fields = [(i.name, i.type, i) for i in fields(cls) if i.name not in exclusions]
return make_dataclass(cls.__name__, new_fields)
return wrapper
@remove('b', 'a')
class B(A):
pass
foo = B(1, 2)
baz = A(1, 2, 3, 4)
print(foo)
print(baz)
Although while writing it out I realized that it might be better suited as a class factory function given that instance checks such as isinstance(foo, A) would fail and users of the code might find it surprising.
from dataclasses import make_dataclass, fields, dataclass
@dataclass
class A:
a: int
b: int
c: int
d: int
def factory(base, name, exclusions):
new_fields = [(i.name, i.type, i) for i in fields(base) if i.name not in exclusions]
return make_dataclass(name, new_fields)
B = factory(base=A, name='B', exclusions=('b', 'c'))
foo = B(1, 2)
baz = A(1, 2, 3, 4)
print(foo)
print(baz)