26 lines
714 B
Python
26 lines
714 B
Python
import inspect
|
|
import sys
|
|
|
|
|
|
class Structure:
|
|
_fields = ()
|
|
|
|
def __repr__(self):
|
|
args = map(lambda field: f"{field}={getattr(self, field)!r}", self._fields)
|
|
return f"{type(self).__name__}({', '.join(args)})"
|
|
|
|
def __setattr__(self, name, value):
|
|
if name in self._fields or name[0] == '_':
|
|
super().__setattr__(name, value)
|
|
else:
|
|
raise AttributeError(f"No attribute {name}")
|
|
|
|
@classmethod
|
|
def create_init(cls):
|
|
code = f'def __init__(self, {", ".join(cls._fields)}):\n'
|
|
for name in cls._fields:
|
|
code += f' self.{name} = {name}\n'
|
|
locs = {}
|
|
exec(code, locs)
|
|
cls.__init__ = locs['__init__']
|