class Samplable:
def __init__(self, method):
self.method = method
def __call__(self, *args, **kwargs):
return self.method(*args, **kwargs)
def sample(self, *args, **kwargs):
return f'sampled {self(*args, **kwargs)}'
class sample:
def __init__(self, func):
self.func = func
def __get__(self, obj, objtype=None):
return Samplable(self.func.__get__(obj))
class Bar:
def __init__(self, data):
self.data = data
@sample
def mean(self):
return f'mean {self.data}'
@sample
def sd(self):
return f'sd {self.data}'
bar = Bar('data')
print(bar.mean())
print(bar.mean.sample())
print(bar.sd())
print(bar.sd.sample())
Y2xhc3MgU2FtcGxhYmxlOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZCk6CiAgICAgICAgc2VsZi5tZXRob2QgPSBtZXRob2QKCiAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICByZXR1cm4gc2VsZi5tZXRob2QoKmFyZ3MsICoqa3dhcmdzKQoKICAgIGRlZiBzYW1wbGUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICByZXR1cm4gZidzYW1wbGVkIHtzZWxmKCphcmdzLCAqKmt3YXJncyl9JwoKY2xhc3Mgc2FtcGxlOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmMpOgogICAgICAgIHNlbGYuZnVuYyA9IGZ1bmMKCiAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIG9ianR5cGU9Tm9uZSk6CiAgICAgICAgcmV0dXJuIFNhbXBsYWJsZShzZWxmLmZ1bmMuX19nZXRfXyhvYmopKQoKY2xhc3MgQmFyOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgogICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKCiAgICBAc2FtcGxlCiAgICBkZWYgbWVhbihzZWxmKToKICAgICAgICByZXR1cm4gZidtZWFuIHtzZWxmLmRhdGF9JwoKICAgIEBzYW1wbGUKICAgIGRlZiBzZChzZWxmKToKICAgICAgICByZXR1cm4gZidzZCB7c2VsZi5kYXRhfScKCmJhciA9IEJhcignZGF0YScpCnByaW50KGJhci5tZWFuKCkpCnByaW50KGJhci5tZWFuLnNhbXBsZSgpKQpwcmludChiYXIuc2QoKSkKcHJpbnQoYmFyLnNkLnNhbXBsZSgpKQ==