# define a decorator method:
def save_db_decorator(fn):
# The wrapper method which will get called instead of the decorated method:
def wrapper(self, *args, **kwargs):
fn(self, *args, **kwargs) # call the decorated method
Test.save_to_db(self, *args, **kwargs) # call the additional method
return wrapper # return the wrapper method
class Test:
# The additional method called by the decorator:
def save_to_db(self, *args, **kwargs):
print("Saver")
# The decorated methods:
@save_db_decorator
def crawl_1(self, *args, **kwargs):
print("Crawler 1")
@save_db_decorator
def crawl_2(self, *args, **kwargs):
print("Crawler 2")
# Calling the decorated methods:
test = Test()
print("Starting Crawler 1")
test.crawl_1()
print("Starting Crawler 1")
test.crawl_2()
IyBkZWZpbmUgYSBkZWNvcmF0b3IgbWV0aG9kOgpkZWYgc2F2ZV9kYl9kZWNvcmF0b3IoZm4pOgoKICAgICMgVGhlIHdyYXBwZXIgbWV0aG9kIHdoaWNoIHdpbGwgZ2V0IGNhbGxlZCBpbnN0ZWFkIG9mIHRoZSBkZWNvcmF0ZWQgbWV0aG9kOgogICAgZGVmIHdyYXBwZXIoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBmbihzZWxmLCAqYXJncywgKiprd2FyZ3MpICAgICAgICAgICAjIGNhbGwgdGhlIGRlY29yYXRlZCBtZXRob2QKICAgICAgICBUZXN0LnNhdmVfdG9fZGIoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKSAgICMgY2FsbCB0aGUgYWRkaXRpb25hbCBtZXRob2QKCiAgICByZXR1cm4gd3JhcHBlciAgIyByZXR1cm4gdGhlIHdyYXBwZXIgbWV0aG9kCgpjbGFzcyBUZXN0OgoKICAgICMgVGhlIGFkZGl0aW9uYWwgbWV0aG9kIGNhbGxlZCBieSB0aGUgZGVjb3JhdG9yOgogICAgCiAgICBkZWYgc2F2ZV90b19kYihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHByaW50KCJTYXZlciIpCiAgICAKICAgIAogICAgIyBUaGUgZGVjb3JhdGVkIG1ldGhvZHM6CiAgICAKICAgIEBzYXZlX2RiX2RlY29yYXRvcgogICAgZGVmIGNyYXdsXzEoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBwcmludCgiQ3Jhd2xlciAxIikKICAgIAogICAgQHNhdmVfZGJfZGVjb3JhdG9yCiAgICBkZWYgY3Jhd2xfMihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHByaW50KCJDcmF3bGVyIDIiKQoKCiMgQ2FsbGluZyB0aGUgZGVjb3JhdGVkIG1ldGhvZHM6Cgp0ZXN0ID0gVGVzdCgpCnByaW50KCJTdGFydGluZyBDcmF3bGVyIDEiKQp0ZXN0LmNyYXdsXzEoKQpwcmludCgiU3RhcnRpbmcgQ3Jhd2xlciAxIikKdGVzdC5jcmF3bF8yKCkK