- # 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