{"id":1981,"date":"2024-06-26T16:31:53","date_gmt":"2024-06-26T16:31:53","guid":{"rendered":"https:\/\/www.w3computing.com\/articles\/?p=1981"},"modified":"2024-06-26T16:31:56","modified_gmt":"2024-06-26T16:31:56","slug":"using-decorators-to-enhance-functionality-in-python","status":"publish","type":"post","link":"https:\/\/www.w3computing.com\/articles\/using-decorators-to-enhance-functionality-in-python\/","title":{"rendered":"Using Decorators to Enhance Functionality in Python"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Decorators in Python provide a powerful mechanism to enhance the functionality of functions or methods without modifying their actual code. They allow for a cleaner and more readable approach to applying common functionality across multiple functions. In this tutorial, we will delve deep into the world of decorators, covering their basic concept, different types, and practical applications, suitable for a non-beginner audience.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Introduction to Decorators<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Decorators are a high-level programming concept that allows you to modify or enhance the behavior of functions or methods. They are often used to add &#8220;wrapping&#8221; functionality, such as logging, timing, access control, and memoization, among others. By leveraging decorators, you can keep your code DRY (Don&#8217;t Repeat Yourself) and adhere to the principles of separation of concerns.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Functions as First-Class Objects<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before we dive into decorators, it&#8217;s essential to understand that functions in Python are first-class objects. This means that functions can be passed around as arguments, returned from other functions, and assigned to variables. This characteristic is what makes decorators possible.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">greet<\/span><span class=\"hljs-params\">(name)<\/span>:<\/span>\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">f\"Hello, <span class=\"hljs-subst\">{name}<\/span>!\"<\/span>\n\n<span class=\"hljs-comment\"># Assigning function to a variable<\/span>\ngreeting = greet\n\n<span class=\"hljs-comment\"># Passing function as an argument<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">call_function<\/span><span class=\"hljs-params\">(func, arg)<\/span>:<\/span>\n    <span class=\"hljs-keyword\">return<\/span> func(arg)\n\nprint(call_function(greet, <span class=\"hljs-string\">\"Alice\"<\/span>))  <span class=\"hljs-comment\"># Output: Hello, Alice!<\/span>\n\n<span class=\"hljs-comment\"># Returning a function from another function<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">outer_function<\/span><span class=\"hljs-params\">()<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">inner_function<\/span><span class=\"hljs-params\">()<\/span>:<\/span>\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Inner Function\"<\/span>\n    <span class=\"hljs-keyword\">return<\/span> inner_function\n\ninner = outer_function()\nprint(inner())  <span class=\"hljs-comment\"># Output: Inner Function<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">3. The Basics of Decorators<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A decorator in its simplest form is a function that takes another function as an argument, adds some functionality, and returns the new function.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 Creating a Simple Decorator<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s create a simple decorator that prints a message before and after a function runs.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">my_decorator<\/span><span class=\"hljs-params\">(func)<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">wrapper<\/span><span class=\"hljs-params\">()<\/span>:<\/span>\n        print(<span class=\"hljs-string\">\"Something is happening before the function is called.\"<\/span>)\n        func()\n        print(<span class=\"hljs-string\">\"Something is happening after the function is called.\"<\/span>)\n    <span class=\"hljs-keyword\">return<\/span> wrapper\n\n<span class=\"hljs-meta\">@my_decorator<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">say_hello<\/span><span class=\"hljs-params\">()<\/span>:<\/span>\n    print(<span class=\"hljs-string\">\"Hello!\"<\/span>)\n\nsay_hello()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">When you run this code, you&#8217;ll get the following output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">Something is happening before the function is called.\nHello!\nSomething is happening after the function is called.<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The <code>@my_decorator<\/code> syntax is a shorthand for <code>say_hello = my_decorator(say_hello)<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 Decorators with Arguments<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Often, the functions we want to decorate will take arguments. Let&#8217;s modify our decorator to handle functions with arguments.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">my_decorator<\/span><span class=\"hljs-params\">(func)<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">wrapper<\/span><span class=\"hljs-params\">(*args, **kwargs)<\/span>:<\/span>\n        print(<span class=\"hljs-string\">\"Something is happening before the function is called.\"<\/span>)\n        result = func(*args, **kwargs)\n        print(<span class=\"hljs-string\">\"Something is happening after the function is called.\"<\/span>)\n        <span class=\"hljs-keyword\">return<\/span> result\n    <span class=\"hljs-keyword\">return<\/span> wrapper\n\n<span class=\"hljs-meta\">@my_decorator<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">say_hello<\/span><span class=\"hljs-params\">(name)<\/span>:<\/span>\n    print(<span class=\"hljs-string\">f\"Hello, <span class=\"hljs-subst\">{name}<\/span>!\"<\/span>)\n\nsay_hello(<span class=\"hljs-string\">\"Alice\"<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This will output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">Something is happening before the function is called.\nHello, Alice!\nSomething is happening after the function is called.<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">4. Using Decorators with Arguments<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sometimes, decorators themselves need to accept arguments. This requires an additional level of nesting.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 Creating a Decorator with Arguments<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s create a decorator that takes an argument to specify how many times a function should run.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">repeat<\/span><span class=\"hljs-params\">(num_times)<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">decorator_repeat<\/span><span class=\"hljs-params\">(func)<\/span>:<\/span>\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">wrapper<\/span><span class=\"hljs-params\">(*args, **kwargs)<\/span>:<\/span>\n            <span class=\"hljs-keyword\">for<\/span> _ <span class=\"hljs-keyword\">in<\/span> range(num_times):\n                result = func(*args, **kwargs)\n            <span class=\"hljs-keyword\">return<\/span> result\n        <span class=\"hljs-keyword\">return<\/span> wrapper\n    <span class=\"hljs-keyword\">return<\/span> decorator_repeat\n\n<span class=\"hljs-meta\">@repeat(num_times=3)<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">say_hello<\/span><span class=\"hljs-params\">(name)<\/span>:<\/span>\n    print(<span class=\"hljs-string\">f\"Hello, <span class=\"hljs-subst\">{name}<\/span>!\"<\/span>)\n\nsay_hello(<span class=\"hljs-string\">\"Alice\"<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This will output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">Hello, Alice!\nHello, Alice!\nHello, Alice!<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">5. Chaining Decorators<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You can apply multiple decorators to a single function by stacking them. The decorators are applied from the innermost (bottom) to the outermost (top).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.1 Example of Chaining Decorators<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s chain two decorators: one that prints a message before and after the function runs, and another that repeats the function execution.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">my_decorator<\/span><span class=\"hljs-params\">(func)<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">wrapper<\/span><span class=\"hljs-params\">(*args, **kwargs)<\/span>:<\/span>\n        print(<span class=\"hljs-string\">\"Something is happening before the function is called.\"<\/span>)\n        result = func(*args, **kwargs)\n        print(<span class=\"hljs-string\">\"Something is happening after the function is called.\"<\/span>)\n        <span class=\"hljs-keyword\">return<\/span> result\n    <span class=\"hljs-keyword\">return<\/span> wrapper\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">repeat<\/span><span class=\"hljs-params\">(num_times)<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">decorator_repeat<\/span><span class=\"hljs-params\">(func)<\/span>:<\/span>\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">wrapper<\/span><span class=\"hljs-params\">(*args, **kwargs)<\/span>:<\/span>\n            <span class=\"hljs-keyword\">for<\/span> _ <span class=\"hljs-keyword\">in<\/span> range(num_times):\n                result = func(*args, **kwargs)\n            <span class=\"hljs-keyword\">return<\/span> result\n        <span class=\"hljs-keyword\">return<\/span> wrapper\n    <span class=\"hljs-keyword\">return<\/span> decorator_repeat\n\n<span class=\"hljs-meta\">@repeat(num_times=3)<\/span>\n<span class=\"hljs-meta\">@my_decorator<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">say_hello<\/span><span class=\"hljs-params\">(name)<\/span>:<\/span>\n    print(<span class=\"hljs-string\">f\"Hello, <span class=\"hljs-subst\">{name}<\/span>!\"<\/span>)\n\nsay_hello(<span class=\"hljs-string\">\"Alice\"<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This will output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">Something is happening before the function is called.\nHello, Alice!\nSomething is happening after the function is called.\nSomething is happening before the function is called.\nHello, Alice!\nSomething is happening after the function is called.\nSomething is happening before the function is called.\nHello, Alice!\nSomething is happening after the function is called.<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">6. Class-Based Decorators<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Decorators can also be implemented as classes. A class-based decorator is a class that defines the <code>__call__<\/code> method, which allows the class instances to be used as decorators.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6.1 Creating a Class-Based Decorator<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s create a class-based decorator that logs the execution time of a function.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">import<\/span> time\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TimeLogger<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">__init__<\/span><span class=\"hljs-params\">(self, func)<\/span>:<\/span>\n        self.func = func\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">__call__<\/span><span class=\"hljs-params\">(self, *args, **kwargs)<\/span>:<\/span>\n        start_time = time.time()\n        result = self.func(*args, **kwargs)\n        end_time = time.time()\n        print(<span class=\"hljs-string\">f\"Function <span class=\"hljs-subst\">{self.func.__name__}<\/span> took <span class=\"hljs-subst\">{end_time - start_time:<span class=\"hljs-number\">.4<\/span>f}<\/span> seconds\"<\/span>)\n        <span class=\"hljs-keyword\">return<\/span> result\n\n<span class=\"hljs-meta\">@TimeLogger<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">say_hello<\/span><span class=\"hljs-params\">(name)<\/span>:<\/span>\n    time.sleep(<span class=\"hljs-number\">1<\/span>)  <span class=\"hljs-comment\"># Simulate a delay<\/span>\n    print(<span class=\"hljs-string\">f\"Hello, <span class=\"hljs-subst\">{name}<\/span>!\"<\/span>)\n\nsay_hello(<span class=\"hljs-string\">\"Alice\"<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This will output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">Hello, Alice!\nFunction say_hello took 1.0000 seconds<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">7. Built-in Decorators<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Python comes with several built-in decorators, such as <code>@staticmethod<\/code>, <code>@classmethod<\/code>, and <code>@property<\/code>. These are commonly used with classes to modify methods&#8217; behavior.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7.1 <code>@staticmethod<\/code> and <code>@classmethod<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">These decorators are used to define methods that are not bound to instance objects.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyClass<\/span>:<\/span>\n<span class=\"hljs-meta\">    @staticmethod<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">static_method<\/span><span class=\"hljs-params\">()<\/span>:<\/span>\n        print(<span class=\"hljs-string\">\"This is a static method.\"<\/span>)\n\n<span class=\"hljs-meta\">    @classmethod<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">class_method<\/span><span class=\"hljs-params\">(cls)<\/span>:<\/span>\n        print(<span class=\"hljs-string\">\"This is a class method.\"<\/span>)\n\nMyClass.static_method()  <span class=\"hljs-comment\"># Output: This is a static method.<\/span>\nMyClass.class_method()   <span class=\"hljs-comment\"># Output: This is a class method.<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">7.2 <code>@property<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>@property<\/code> decorator is used to define getter methods for class attributes.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyClass<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">__init__<\/span><span class=\"hljs-params\">(self, value)<\/span>:<\/span>\n        self._value = value\n\n<span class=\"hljs-meta\">    @property<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">value<\/span><span class=\"hljs-params\">(self)<\/span>:<\/span>\n        <span class=\"hljs-keyword\">return<\/span> self._value\n\n<span class=\"hljs-meta\">    @value.setter<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">value<\/span><span class=\"hljs-params\">(self, new_value)<\/span>:<\/span>\n        self._value = new_value\n\nobj = MyClass(<span class=\"hljs-number\">10<\/span>)\nprint(obj.value)  <span class=\"hljs-comment\"># Output: 10<\/span>\nobj.value = <span class=\"hljs-number\">20<\/span>\nprint(obj.value)  <span class=\"hljs-comment\"># Output: 20<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">8. Practical Applications of Decorators<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Decorators are incredibly versatile and can be used in various practical scenarios.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">8.1 Logging<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Logging is one of the most common uses of decorators.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">log<\/span><span class=\"hljs-params\">(func)<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">wrapper<\/span><span class=\"hljs-params\">(*args, **kwargs)<\/span>:<\/span>\n        print(<span class=\"hljs-string\">f\"Calling function <span class=\"hljs-subst\">{func.__name__}<\/span> with arguments <span class=\"hljs-subst\">{args}<\/span> and <span class=\"hljs-subst\">{kwargs}<\/span>\"<\/span>)\n        result = func(*args, **kwargs)\n        print(<span class=\"hljs-string\">f\"Function <span class=\"hljs-subst\">{func.__name__}<\/span> returned <span class=\"hljs-subst\">{result}<\/span>\"<\/span>)\n        <span class=\"hljs-keyword\">return<\/span> result\n    <span class=\"hljs-keyword\">return<\/span> wrapper\n\n<span class=\"hljs-meta\">@log<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">add<\/span><span class=\"hljs-params\">(a, b)<\/span>:<\/span>\n    <span class=\"hljs-keyword\">return<\/span> a + b\n\nadd(<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">5<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This will output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">Calling function add with arguments (3, 5) and {}\nFunction add returned 8<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">8.2 Access Control<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Decorators can be used to enforce access control.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">requires_authorization<\/span><span class=\"hljs-params\">(func)<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">wrapper<\/span><span class=\"hljs-params\">(*args, **kwargs)<\/span>:<\/span>\n        <span class=\"hljs-keyword\">if<\/span> <span class=\"hljs-keyword\">not<\/span> kwargs.get(<span class=\"hljs-string\">\"authorized\"<\/span>, <span class=\"hljs-literal\">False<\/span>):\n            print(<span class=\"hljs-string\">\"Authorization required\"<\/span>)\n            <span class=\"hljs-keyword\">return<\/span>\n        <span class=\"hljs-keyword\">return<\/span> func(*args, **kwargs)\n    <span class=\"hljs-keyword\">return<\/span> wrapper\n\n<span class=\"hljs-meta\">@requires_authorization<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">sensitive_operation<\/span><span class=\"hljs-params\">(data, authorized=False)<\/span>:<\/span>\n    print(<span class=\"hljs-string\">f\"Performing sensitive operation with <span class=\"hljs-subst\">{data}<\/span>\"<\/span>)\n\nsensitive_operation(<span class=\"hljs-string\">\"some data\"<\/span>, authorized=<span class=\"hljs-literal\">True<\/span>)  <span class=\"hljs-comment\"># Output: Performing sensitive operation with some data<\/span>\nsensitive_operation(<span class=\"hljs-string\">\"some data\"<\/span>, authorized=<span class=\"hljs-literal\">False<\/span>) <span class=\"hljs-comment\"># Output: Authorization required<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">8.3 Caching (Memoization)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Caching results of expensive function calls is another practical use of decorators.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">memoize<\/span><span class=\"hljs-params\">(func)<\/span>:<\/span>\n    cache = {}\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">wrapper<\/span><span class=\"hljs-params\">(*args)<\/span>:<\/span>\n        <span class=\"hljs-keyword\">if<\/span> args <span class=\"hljs-keyword\">in<\/span> cache:\n            <span class=\"hljs-keyword\">return<\/span> cache&#91;args]\n        result = func(*args)\n        cache&#91;args] = result\n        <span class=\"hljs-keyword\">return<\/span> result\n    <span class=\"hljs-keyword\">return<\/span> wrapper\n\n<span class=\"hljs-meta\">@memoize<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">fibonacci<\/span><span class=\"hljs-params\">(n)<\/span>:<\/span>\n    <span class=\"hljs-keyword\">if<\/span> n <span class=\"hljs-keyword\">in<\/span> &#91;<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">1<\/span>]:\n        <span class=\"hljs-keyword\">return<\/span> n\n    <span class=\"hljs-keyword\">return<\/span> fibonacci(n<span class=\"hljs-number\">-1<\/span>) + fibonacci(n<span class=\"hljs-number\">-2<\/span>)\n\nprint(fibonacci(<span class=\"hljs-number\">35<\/span>))  <span class=\"hljs-comment\"># Output: 9227465<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">8.4 Timing<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Timing the execution of functions can help identify performance bottlenecks.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">import<\/span> time\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">timer<\/span><span class=\"hljs-params\">(func)<\/span>:<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">wrapper<\/span><span class=\"hljs-params\">(*args, **kwargs)<\/span>:<\/span>\n        start_time = time.time()\n        result = func(*args, **kwargs)\n        end_time = time.time()\n        print(f\n\n<span class=\"hljs-string\">\"Function {func.__name__} took {end_time - start_time:.4f} seconds\"<\/span>)\n        <span class=\"hljs-keyword\">return<\/span> result\n    <span class=\"hljs-keyword\">return<\/span> wrapper\n\n<span class=\"hljs-meta\">@timer<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">slow_function<\/span><span class=\"hljs-params\">()<\/span>:<\/span>\n    time.sleep(<span class=\"hljs-number\">2<\/span>)\n\nslow_function()  <span class=\"hljs-comment\"># Output: Function slow_function took 2.0000 seconds<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">9. Debugging Decorators<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Debugging decorators can be tricky because they can obscure the original function&#8217;s signature and docstring. The <code>functools.wraps<\/code> decorator helps preserve these attributes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">9.1 Using <code>functools.wraps<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>functools.wraps<\/code> decorator ensures that the decorated function retains its original attributes.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">from<\/span> functools <span class=\"hljs-keyword\">import<\/span> wraps\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">my_decorator<\/span><span class=\"hljs-params\">(func)<\/span>:<\/span>\n<span class=\"hljs-meta\">    @wraps(func)<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">wrapper<\/span><span class=\"hljs-params\">(*args, **kwargs)<\/span>:<\/span>\n        print(<span class=\"hljs-string\">\"Something is happening before the function is called.\"<\/span>)\n        result = func(*args, **kwargs)\n        print(<span class=\"hljs-string\">\"Something is happening after the function is called.\"<\/span>)\n        <span class=\"hljs-keyword\">return<\/span> result\n    <span class=\"hljs-keyword\">return<\/span> wrapper\n\n<span class=\"hljs-meta\">@my_decorator<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">say_hello<\/span><span class=\"hljs-params\">(name)<\/span>:<\/span>\n    <span class=\"hljs-string\">\"\"\"Greet a person by name.\"\"\"<\/span>\n    print(<span class=\"hljs-string\">f\"Hello, <span class=\"hljs-subst\">{name}<\/span>!\"<\/span>)\n\nprint(say_hello.__name__)  <span class=\"hljs-comment\"># Output: say_hello<\/span>\nprint(say_hello.__doc__)   <span class=\"hljs-comment\"># Output: Greet a person by name.<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Without <code>@wraps<\/code>, the <code>__name__<\/code> and <code>__doc__<\/code> attributes would reflect the wrapper function instead of the original function.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">10. Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Decorators are a powerful tool in Python that allow you to extend and modify the behavior of functions and methods without changing their actual code. They promote code reusability, readability, and maintainability. This tutorial covered the basics of decorators, creating decorators with and without arguments, chaining decorators, class-based decorators, built-in decorators, practical applications, and debugging techniques.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Decorators in Python provide a powerful mechanism to enhance the functionality of functions or methods without modifying their actual code. They allow for a cleaner and more readable approach to applying common functionality across multiple functions. In this tutorial, we will delve deep into the world of decorators, covering their basic concept, different types, and [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4,6],"tags":[],"class_list":["post-1981","post","type-post","status-publish","format-standard","category-programming-languages","category-python","entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Using Decorators to Enhance Functionality in Python<\/title>\n<meta name=\"description\" content=\"Decorators in Python provide a powerful mechanism to enhance the functionality of functions or methods without modifying their actual code.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.w3computing.com\/articles\/using-decorators-to-enhance-functionality-in-python\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using Decorators to Enhance Functionality in Python\" \/>\n<meta property=\"og:description\" content=\"Decorators in Python provide a powerful mechanism to enhance the functionality of functions or methods without modifying their actual code.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.w3computing.com\/articles\/using-decorators-to-enhance-functionality-in-python\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-26T16:31:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-26T16:31:56+00:00\" \/>\n<meta name=\"author\" content=\"w3compadmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"w3compadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/using-decorators-to-enhance-functionality-in-python\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/using-decorators-to-enhance-functionality-in-python\\\/\"},\"author\":{\"name\":\"w3compadmin\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"headline\":\"Using Decorators to Enhance Functionality in Python\",\"datePublished\":\"2024-06-26T16:31:53+00:00\",\"dateModified\":\"2024-06-26T16:31:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/using-decorators-to-enhance-functionality-in-python\\\/\"},\"wordCount\":637,\"articleSection\":[\"Programming Languages\",\"Python\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/using-decorators-to-enhance-functionality-in-python\\\/\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/using-decorators-to-enhance-functionality-in-python\\\/\",\"name\":\"Using Decorators to Enhance Functionality in Python\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\"},\"datePublished\":\"2024-06-26T16:31:53+00:00\",\"dateModified\":\"2024-06-26T16:31:56+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"description\":\"Decorators in Python provide a powerful mechanism to enhance the functionality of functions or methods without modifying their actual code.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/using-decorators-to-enhance-functionality-in-python\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/using-decorators-to-enhance-functionality-in-python\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/using-decorators-to-enhance-functionality-in-python\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Articles Home\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Programming Languages\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/programming-languages\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Python\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/programming-languages\\\/python\\\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Using Decorators to Enhance Functionality in Python\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\",\"name\":\"Developer Articles Hub\",\"description\":\"\",\"alternateName\":\"Developer Articles\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\",\"name\":\"w3compadmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"contentUrl\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"caption\":\"w3compadmin\"},\"sameAs\":[\"http:\\\/\\\/w3computing.com\\\/articles\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Using Decorators to Enhance Functionality in Python","description":"Decorators in Python provide a powerful mechanism to enhance the functionality of functions or methods without modifying their actual code.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.w3computing.com\/articles\/using-decorators-to-enhance-functionality-in-python\/","og_locale":"en_US","og_type":"article","og_title":"Using Decorators to Enhance Functionality in Python","og_description":"Decorators in Python provide a powerful mechanism to enhance the functionality of functions or methods without modifying their actual code.","og_url":"https:\/\/www.w3computing.com\/articles\/using-decorators-to-enhance-functionality-in-python\/","article_published_time":"2024-06-26T16:31:53+00:00","article_modified_time":"2024-06-26T16:31:56+00:00","author":"w3compadmin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"w3compadmin","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.w3computing.com\/articles\/using-decorators-to-enhance-functionality-in-python\/#article","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/using-decorators-to-enhance-functionality-in-python\/"},"author":{"name":"w3compadmin","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"headline":"Using Decorators to Enhance Functionality in Python","datePublished":"2024-06-26T16:31:53+00:00","dateModified":"2024-06-26T16:31:56+00:00","mainEntityOfPage":{"@id":"https:\/\/www.w3computing.com\/articles\/using-decorators-to-enhance-functionality-in-python\/"},"wordCount":637,"articleSection":["Programming Languages","Python"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.w3computing.com\/articles\/using-decorators-to-enhance-functionality-in-python\/","url":"https:\/\/www.w3computing.com\/articles\/using-decorators-to-enhance-functionality-in-python\/","name":"Using Decorators to Enhance Functionality in Python","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/#website"},"datePublished":"2024-06-26T16:31:53+00:00","dateModified":"2024-06-26T16:31:56+00:00","author":{"@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"description":"Decorators in Python provide a powerful mechanism to enhance the functionality of functions or methods without modifying their actual code.","breadcrumb":{"@id":"https:\/\/www.w3computing.com\/articles\/using-decorators-to-enhance-functionality-in-python\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.w3computing.com\/articles\/using-decorators-to-enhance-functionality-in-python\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.w3computing.com\/articles\/using-decorators-to-enhance-functionality-in-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Articles Home","item":"https:\/\/www.w3computing.com\/articles\/"},{"@type":"ListItem","position":2,"name":"Programming Languages","item":"https:\/\/www.w3computing.com\/articles\/programming-languages\/"},{"@type":"ListItem","position":3,"name":"Python","item":"https:\/\/www.w3computing.com\/articles\/programming-languages\/python\/"},{"@type":"ListItem","position":4,"name":"Using Decorators to Enhance Functionality in Python"}]},{"@type":"WebSite","@id":"https:\/\/www.w3computing.com\/articles\/#website","url":"https:\/\/www.w3computing.com\/articles\/","name":"Developer Articles Hub","description":"","alternateName":"Developer Articles","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.w3computing.com\/articles\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561","name":"w3compadmin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","url":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","contentUrl":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","caption":"w3compadmin"},"sameAs":["http:\/\/w3computing.com\/articles"]}]}},"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"w3compadmin","author_link":"https:\/\/www.w3computing.com\/articles\/author\/w3compadmin\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1981","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/comments?post=1981"}],"version-history":[{"count":1,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1981\/revisions"}],"predecessor-version":[{"id":1982,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1981\/revisions\/1982"}],"wp:attachment":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/media?parent=1981"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/categories?post=1981"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/tags?post=1981"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}