Coin de Gamma
6 years ago
1 changed files with 65 additions and 0 deletions
@ -0,0 +1,65 @@ |
|||||||
|
from inspect import signature, Parameter |
||||||
|
from functools import wraps |
||||||
|
|
||||||
|
|
||||||
|
def inited_params(target_init): |
||||||
|
target_params = signature(target_init).parameters.values() |
||||||
|
if len(target_params) < 1: |
||||||
|
raise ValueError('init function mush have at least self parameter') |
||||||
|
if len(target_params) == 1: |
||||||
|
return target_init |
||||||
|
_, *target_params = target_params # we will not use self any more |
||||||
|
|
||||||
|
@wraps(target_init) |
||||||
|
def wrapped_init(wrapped_self, *wrapped_args, **wrapped_kwargs): |
||||||
|
for tp in target_params: |
||||||
|
if tp.default is Parameter.empty: |
||||||
|
continue |
||||||
|
setattr(wrapped_self, tp.name, tp.default) |
||||||
|
|
||||||
|
for tp, v in zip(target_params, wrapped_args): |
||||||
|
setattr(wrapped_self, tp.name, v) |
||||||
|
|
||||||
|
for k, v in wrapped_kwargs.items(): |
||||||
|
setattr(wrapped_self, k, v) |
||||||
|
|
||||||
|
target_init(wrapped_self, *wrapped_args, **wrapped_kwargs) |
||||||
|
|
||||||
|
return wrapped_init |
||||||
|
|
||||||
|
def JSONClass(target_class): |
||||||
|
|
||||||
|
class NewJSONClass(target_class): |
||||||
|
|
||||||
|
def to_json(self) -> dict: |
||||||
|
""" |
||||||
|
returns a json representation of the class |
||||||
|
where all None - values and private fileds are skipped |
||||||
|
""" |
||||||
|
private_prefix = '__' + target_class.__name__ |
||||||
|
result = { |
||||||
|
k: v for k, v in self.__dict__.items() |
||||||
|
if v is not None and not k.startswith(private_prefix) |
||||||
|
} |
||||||
|
return result |
||||||
|
|
||||||
|
@staticmethod |
||||||
|
def from_json(json_object: dict): |
||||||
|
return NewJSONClass(**json_object) |
||||||
|
|
||||||
|
return NewJSONClass |
||||||
|
|
||||||
|
|
||||||
|
class ServerMessage: |
||||||
|
|
||||||
|
@inited_params |
||||||
|
def __init__(self, method: str, payload: object = None, request_id: int = None): |
||||||
|
""" |
||||||
|
does something interesting |
||||||
|
""" |
||||||
|
print('mymethod', self.method) |
||||||
|
|
||||||
|
s = ServerMessage('naaaame', request_id=3) |
||||||
|
|
||||||
|
#ServerMessage.from_json({}) |
||||||
|
#print(s.to_json()) |
Loading…
Reference in new issue