from dataclasses import dataclass
from inspect import signature

def default_self(method):
    def wrapper(self, *args, **kwargs):
        bound = sig.bind(self, *args, **kwargs)
        bound.apply_defaults()
        for name in names:
            if bound.arguments[name] is DEFAULT:
                bound.arguments[name] = getattr(self, name)
        return method(*bound.args, **bound.kwargs)

    sig = signature(method)
    names = [name for name, param in sig.parameters.items() if param.default is DEFAULT]
    return wrapper

DEFAULT = object()

@dataclass
class PlusCalculator:
    x: int = 1
    y: int = 2
    result: int = None

    @default_self
    def plus(self, x=DEFAULT, y=DEFAULT):
        self.result = x + y
        return self.result

pc = PlusCalculator()
print(pc.plus())
print(pc.plus(4, 5))
print(pc.plus(y=3))
print(pc.plus(x=2, y=3))