{"id":120077,"date":"2026-07-08T17:11:35","date_gmt":"2026-07-08T11:41:35","guid":{"rendered":"https:\/\/www.guvi.in\/blog\/?p=120077"},"modified":"2026-08-24T16:20:15","modified_gmt":"2026-08-24T10:50:15","slug":"abstract-base-classes-in-python","status":"publish","type":"post","link":"https:\/\/www.guvi.in\/blog\/abstract-base-classes-in-python\/","title":{"rendered":"Abstract Base Classes in Python: Enforcing Interfaces Without Java"},"content":{"rendered":"\n<p>If you&#8217;ve worked with Java, you know how interfaces enforce contracts: every implementing class must define certain methods or the compiler refuses to build. Python has no interface keyword, and for a long time, that felt like a gap. Abstract base classes fill it cleanly, and in many ways, more flexibly than Java&#8217;s approach.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>TL;DR Summary&nbsp;<\/strong><\/h2>\n\n\n\n<ul>\n<li>ABCs enforce interfaces without Java: inherit from ABC and mark required methods with @abstractmethod; Python raises TypeError at instantiation if any are unimplemented.<\/li>\n\n\n\n<li>Key wins over duck typing\/NotImplementedError: failures surface at object creation (not later calls), all unimplemented methods are caught together, and type checkers (mypy) and IDEs provide strong support.<\/li>\n\n\n\n<li>Use ABCs for multiple implementations of a shared contract (payment gateways, storages, notificators); they support concrete methods (Template Method), abstract properties\/class methods, and virtual subclasses via register().<\/li>\n<\/ul>\n\n\n\n<p>Master Python interface enforcement with ABCs, no Java needed. Go from zero to hero in Python with HCL GUVI\u2019s <strong>Python Zero to Hero Course. <\/strong><a href=\"https:\/\/www.guvi.in\/courses\/programming\/python-zero-to-hero\/\" target=\"_blank\" rel=\"noreferrer noopener\">Start your Python journey here<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What Are Abstract Base Classes in Python?<\/strong><\/h2>\n\n\n\n<p>An Abstract Base Class (ABC) is a class that cannot be instantiated directly. It defines a contract a set of methods every subclass must implement. If a subclass fails to implement even one required method, Python raises a TypeError at instantiation.<\/p>\n\n\n\n<p>The abc module provides everything you need: the ABC class to inherit from and the <strong>@abstractmethod <\/strong>decorator to mark required methods.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>The Problem ABCs Solve<\/strong><\/h2>\n\n\n\n<p>Python follows duck typing: if an object has the right methods, it works. That&#8217;s powerful, but it shifts errors from early to late. Without enforcement, a developer can inherit from a base class, forget to implement a critical method, and only discover the mistake at runtime, deep inside a <a href=\"https:\/\/www.guvi.in\/blog\/production-system-in-ai\/\" target=\"_blank\" rel=\"noreferrer noopener\">production system.<\/a><\/p>\n\n\n\n<p>Here is what that failure looks like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Notifier: def send(self, message): raise NotImplementedError(\"Subclasses must implement send()\")\n\nclass EmailNotifier(Notifier): pass # forgot to implement send()\n\nn = EmailNotifier() n.send(\"Hello\") # Fails at runtime, not at class definition<\/code><\/pre>\n\n\n\n<p>EmailNotifier was created successfully. The error only surfaces when you call send(), potentially deep in production code, long after instantiation. ABCs fix this by moving the error to the moment you try to create the object.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Setting Up Your First ABC<\/strong><\/h2>\n\n\n\n<p>The abc module ships with the standard library; no installation needed. You need two things: inherit from ABC and mark required methods with @abstractmethod.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from abc import ABC, abstractmethod\n\nclass Notifier(ABC): @abstractmethod def send(self, message: str) -&gt; None: pass\n\nclass EmailNotifier(Notifier): pass # still missing send()\n\nn = EmailNotifier()<\/code><\/pre>\n\n\n\n<div style=\"background-color: #099f4e; border: 3px solid #110053; border-radius: 12px; padding: 18px 22px; color: #FFFFFF; font-size: 18px; font-family: Montserrat, Helvetica, sans-serif; line-height: 1.6; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); max-width: 750px;\">\n\n  <strong style=\"font-size: 22px; color: #FFFFFF;\">\ud83d\udca1 Did You Know?<\/strong>\n  <br \/><br \/>\n\n  Python&#8217;s <strong style=\"color: #FFFFFF;\">Abstract Base Classes (ABCs)<\/strong> help catch implementation errors early by preventing the instantiation of classes that do not implement all required abstract methods. Instead of failing later when a missing method is called in production, Python raises a <strong style=\"color: #FFFFFF;\">TypeError<\/strong> as soon as you try to create an object from an incomplete subclass, making ABCs a valuable tool for building more reliable and maintainable object-oriented applications.\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>TypeError: Can&#8217;t instantiate abstract class EmailNotifierWith the abstract method send<\/strong><\/h2>\n\n\n\n<p>The moment you try to instantiate EmailNotifier without implementing send(), Python raises a TypeError, not when you call the method but when you create the object. That&#8217;s the key difference.<\/p>\n\n\n\n<p>Now implement the required method:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class EmailNotifier(Notifier): def send(self, message: str) -&gt; None: print(f\"Sending email: {message}\")\n\nn = EmailNotifier() n.send(\"Your order is confirmed.\")<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Output: Sending email: Your order is confirmed.<\/strong><\/h3>\n\n\n\n<p>Clean, enforced, and readable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>How ABCMeta Works Under the Hood<\/strong><\/h2>\n\n\n\n<ul>\n<li>When you inherit from ABC, you&#8217;re using ABCMeta, Python&#8217;s metaclass that tracks abstract methods and refuses instantiation if any remain unimplemented in a concrete subclass.<\/li>\n\n\n\n<li>You can use ABCMeta directly if needed, which is useful in situations involving multiple inheritance:<\/li>\n\n\n\n<li>from abc import ABCMeta, abstractmethod<\/li>\n\n\n\n<li>class Notifier(metaclass= ABCMeta): @abstractmethod def send(self, message: str) -&gt; None: pass<\/li>\n\n\n\n<li>Inheriting from ABC is a cleaner syntax for the same thing. ABC is a helper class whose metaclass is already ABCMeta.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>ABCs vs Raising NotImplementedError<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1200\" height=\"630\" src=\"https:\/\/www.guvi.in\/blog\/wp-content\/uploads\/2026\/08\/02.webp\" alt=\"ABCs vs raising notimplementederror\" class=\"wp-image-135178\" srcset=\"https:\/\/www.guvi.in\/blog\/wp-content\/uploads\/2026\/08\/02.webp 1200w, https:\/\/www.guvi.in\/blog\/wp-content\/uploads\/2026\/08\/02-300x158.webp 300w, https:\/\/www.guvi.in\/blog\/wp-content\/uploads\/2026\/08\/02-768x403.webp 768w, https:\/\/www.guvi.in\/blog\/wp-content\/uploads\/2026\/08\/02-150x79.webp 150w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" title=\"\"><\/figure>\n\n\n\n<p>Before ABCs, the common pattern was raising NotImplementedError in base class methods. Valid for simple cases, but it only fails when the method is called, not when the object is created.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Approach<\/strong><\/td><td><strong>Fails When<\/strong><\/td><td><strong>Catches All Unimplemented Methods<\/strong><\/td><td><strong>IDE Support<\/strong><\/td><\/tr><tr><td>raise NotImplementedError<\/td><td>At method call<\/td><td>No, each method fails separately<\/td><td>Limited<\/td><\/tr><tr><td>ABC + @abstractmethod<\/td><td>At instantiation<\/td><td>Yes, all at once<\/td><td>Strong (type checkers flag this)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>ABCs enforce contracts at class design time and integrate with static type checkers like mypy and IDE tools.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>A Real-World Example: Payment Gateway<\/strong><\/h2>\n\n\n\n<p>You&#8217;re building an e-commerce system supporting multiple payment providers, such as Stripe, PayPal, and others to come. Every provider must implement the same three operations. from abc import ABC, abstractmethod<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>@abstractmethod<br>def charge(self, amount: float, currency: str) -&gt; dict:<br>&nbsp;&nbsp;&nbsp;&nbsp;\u201c\u201d\u201dCharge the customer and return a transaction result.\u201d\u201d\u201d<br>&nbsp;&nbsp;&nbsp;&nbsp;pass<br>@abstractmethod<br>def refund(self, transaction_id: str) -&gt; bool:<br>&nbsp;&nbsp;&nbsp;&nbsp;\u201c\u201d\u201dRefund a transaction by ID. Returns True on success.\u201d\u201d\u201d<br>&nbsp;&nbsp;&nbsp;&nbsp;pass<br>@abstractmethod<br>def get_status(self, transaction_id: str) -&gt; str:<br>&nbsp;&nbsp;&nbsp;&nbsp;\u201c\u201d\u201dReturn current transaction status.\u201d\u201d\u201d<br>&nbsp;&nbsp;&nbsp;&nbsp;pass<br>class StripeGateway(PaymentGateway):<br>def charge(self, amount: float, currency: str) -&gt; dict:<br>&nbsp;&nbsp;&nbsp;&nbsp;# Stripe-specific implementation<br>&nbsp;&nbsp;&nbsp;&nbsp;return {\u201cstatus\u201d: \u201csuccess\u201d, \u201cprovider\u201d: \u201cstripe\u201d, \u201camount\u201d: amount}<br>def refund(self, transaction_id: str) -&gt; bool:<br>&nbsp;&nbsp;&nbsp;&nbsp;# Stripe-specific refund logic<br>&nbsp;&nbsp;&nbsp;&nbsp;return True<br>def get_status(self, transaction_id: str) -&gt; str:<br>&nbsp;&nbsp;&nbsp;&nbsp;return \u201ccompleted\u201d<br>class PayPalGateway(PaymentGateway):<br>def charge(self, amount: float, currency: str) -&gt; dict:<br>&nbsp;&nbsp;&nbsp;&nbsp;return {\u201cstatus\u201d: \u201csuccess\u201d, \u201cprovider\u201d: \u201cpaypal\u201d, \u201camount\u201d: amount}<br>def refund(self, transaction_id: str) -&gt; bool:<br>&nbsp;&nbsp;&nbsp;&nbsp;return True<br>def get_status(self, transaction_id: str) -&gt; str:<br>&nbsp;&nbsp;&nbsp;&nbsp;return \u201ccompleted\u201d<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Any function accepting a payment gateway works with any provider. <a href=\"https:\/\/www.guvi.in\/blog\/beginner-roadmap-for-python-basics-to-web-frameworks\/\" target=\"_blank\" rel=\"noreferrer noopener\">Python <\/a>guarantees all three methods exist before an instance is created. Add a new gateway, forget charge(), and Python tells you immediately.<\/p>\n\n\n\n<p><em>Master Python interface enforcement with ABCs, no Java needed. Go from zero to hero in Python with HCL GUVI\u2019s <\/em><strong><em>Python Zero to Hero Course. <\/em><\/strong><a href=\"https:\/\/www.guvi.in\/courses\/programming\/python-zero-to-hero\/\" target=\"_blank\" rel=\"noreferrer noopener\"><em>Start your Python journey here<\/em><\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Abstract Properties and Class Methods<\/strong><\/h2>\n\n\n\n<p>ABCs work beyond regular methods; you can mark properties and class methods as abstract, too.<\/p>\n\n\n\n<p>from abc import ABC, abstractmethod<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>class DataStore(ABC):<br>@property<br>@abstractmethod<br>def connection_string(self) -&gt; str:<br>&nbsp;&nbsp;&nbsp;&nbsp;pass<br>@classmethod<br>@abstractmethod<br>def from_config(cls, config: dict) -&gt; \u201cDataStore\u201d:<br>&nbsp;&nbsp;&nbsp;&nbsp;pass<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>When combining @property with @abstractmethod, @abstractmethod must be the innermost decorator closest to the method definition. Easy to get wrong; worth remembering.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Concrete Methods Inside an ABC<\/strong><\/h2>\n\n\n\n<p>ABCs can also contain concrete method implementations that every subclass inherits automatically. This is where ABCs outshine<a href=\"https:\/\/guvi-unified.codingpuppet.com\/hub\/java-tutorial\/interface\/\" target=\"_blank\" rel=\"noopener\"> Java inter<\/a><a href=\"https:\/\/guvi-unified.codingpuppet.com\/hub\/java-tutorial\/interface\/\" target=\"_blank\" rel=\"noreferrer noopener\">f<\/a><a href=\"https:\/\/guvi-unified.codingpuppet.com\/hub\/java-tutorial\/interface\/\" target=\"_blank\" rel=\"noopener\">aces <\/a>(which, before <a href=\"https:\/\/www.guvi.in\/blog\/getting-started-with-java\/\" target=\"_blank\" rel=\"noreferrer noopener\">Java <\/a>8, could contain no implementation at all).<\/p>\n\n\n\n<p>from abc import ABC, abstractmethod<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>class Report(ABC):<br>@abstractmethod<br>def generate(self) -&gt; str:<br>&nbsp;&nbsp;&nbsp;&nbsp;pass<br>def save(self, filepath: str) -&gt; None:<br>&nbsp;&nbsp;&nbsp;&nbsp;content = self.generate()<br>&nbsp;&nbsp;&nbsp;&nbsp;with open(filepath, \u201cw\u201d) as f:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.write(content)<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f\u201dReport saved to {filepath}\u201d)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>generate() is abstract; every subclass must implement it. save() is concrete and shared across all subclasses automatically. This is called the Template Method pattern, and it&#8217;s one of the most practical uses of ABCs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Virtual Subclasses: The register() Method<\/strong><\/h2>\n\n\n\n<p>ABCs have one more feature Java interfaces don&#8217;t: virtual subclasses. You can register a class as a subclass without it inheriting from the ABC. Useful for integrating third-party classes you don&#8217;t control.<\/p>\n\n\n\n<p>from abc import ABC, abstractmethod<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>class Drawable(ABC): @abstractmethod def draw(self) -&gt; None: pass<br>class ThirdPartyWidget: def draw(self) -&gt; None: print(\u201cDrawing widget from external library\u201d)<br>Drawable.register(ThirdPartyWidget)<br>print(issubclass(ThirdPartyWidget, Drawable)) # True print(isinstance(ThirdPartyWidget(), Drawable)) # True<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>ThirdPartyWidget passes isinstance() and issubclass() checks against Drawable, but Python does not enforce abstract method implementation here. register() is for duck-typing compatibility, not enforcement. Use it for code you don&#8217;t own; use inheritance for strict contracts.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>When to Use ABCs and When Not To<\/strong><\/h2>\n\n\n\n<p>ABCs are the right tool when multiple concrete implementations must conform to a shared contract: payment gateways, storage backends, notification channels, and serializers. Skip ABCs for single implementations with no polymorphism. Python&#8217;s duck typing handles simpler cases fine without formal contracts.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Use ABCs When<\/strong><\/td><td><strong>Skip ABCs When<\/strong><\/td><\/tr><tr><td>Multiple implementations of one interface<\/td><td>Single implementation, no polymorphism<\/td><\/tr><tr><td>Enforcing contracts across a team<\/td><td>Small script or utility module<\/td><\/tr><tr><td>Integrating with type checkers (mypy)<\/td><td>Duck typing handles it cleanly<\/td><\/tr><tr><td>Template Method pattern needed<\/td><td>No shared base behaviour required<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>ABCs in Python&#8217;s Standard Library<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1200\" height=\"630\" src=\"https:\/\/www.guvi.in\/blog\/wp-content\/uploads\/2026\/08\/03.webp\" alt=\"ABCs in python standard library\" class=\"wp-image-135180\" srcset=\"https:\/\/www.guvi.in\/blog\/wp-content\/uploads\/2026\/08\/03.webp 1200w, https:\/\/www.guvi.in\/blog\/wp-content\/uploads\/2026\/08\/03-300x158.webp 300w, https:\/\/www.guvi.in\/blog\/wp-content\/uploads\/2026\/08\/03-768x403.webp 768w, https:\/\/www.guvi.in\/blog\/wp-content\/uploads\/2026\/08\/03-150x79.webp 150w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" title=\"\"><\/figure>\n\n\n\n<ul>\n<li>Python&#8217;s standard library uses ABCs heavily. The collections.abc module defines ABCs for container types: Iterable, Iterator, Mapping, Sequence, MutableMapping, and more.<\/li>\n\n\n\n<li>When you write isinstance(obj, Iterable), you&#8217;re using an ABC check. Any class implementing <strong>iter<\/strong> is automatically recognised as an Iterable through ABCMeta&#8217;s <strong>subclasshook<\/strong>&nbsp; ABCs at work across the entire language, not just in userland code.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusion<\/strong><\/h2>\n\n\n\n<p>Abstract Base Classes give Python developers a formal, enforceable way to define interfaces, catching missing implementations at object creation rather than deep inside runtime execution.&nbsp;<\/p>\n\n\n\n<p>The abc module is clean, Pythonic, and more flexible than Java interfaces in key ways: concrete methods in the base class, virtual subclass registration, and seamless integration with Python&#8217;s duck-typing philosophy.<\/p>\n\n\n\n<p>The next time you find yourself writing two or more classes that should all support the same interface, reach for an ABC. The contract it enforces will save you from subtle, hard-to-debug errors down the line&nbsp; and make your codebase easier for every developer who works in it after you.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>FAQs<\/strong><\/h2>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-1783506457552\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>How do I create an ABC in Python?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Inherit from ABC and decorate required methods with @abstractmethod from the abc module; unimplemented subclasses can\u2019t be instantiated.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1783506461501\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>Why use ABCs instead of raising NotImplementedError?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>ABCs fail at instantiation and catch all unimplemented methods together; they also integrate with type checkers and IDEs for stronger enforcement.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1783506470291\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>Can ABCs have concrete (non-abstract) methods?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Yes\u2014ABCs can include concrete methods that subclasses inherit; this enables the Template Method pattern (e.g., a shared save() method).<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1783506477486\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>How do I define abstract properties or class methods?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>For properties: @property + @abstractmethod (with @abstractmethod innermost). For class methods: @classmethod + @abstractmethod.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1783506485742\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>What are virtual subclasses and when to use register()?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Virtual subclasses are third-party classes registered as subclasses without inheriting; use register() for duck-typing compatibility when you don\u2019t control the class.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1783506493700\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>When should I skip ABCs?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Skip them for single implementations with no polymorphism, small scripts, or when duck typing cleanly handles the case without formal contracts.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1783506499668\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>How do ABCs appear in Python\u2019s standard library?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>collections.abc defines ABCs like Iterable, Iterator, Mapping, Sequence; isinstance checks (e.g., isinstance(obj, Iterable)) use ABCs behind the scenes.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>If you&#8217;ve worked with Java, you know how interfaces enforce contracts: every implementing class must define certain methods or the compiler refuses to build. Python has no interface keyword, and for a long time, that felt like a gap. Abstract base classes fill it cleanly, and in many ways, more flexibly than Java&#8217;s approach.&nbsp; TL;DR [&hellip;]<\/p>\n","protected":false},"author":63,"featured_media":135177,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[717],"tags":[],"views":"208","authorinfo":{"name":"Vishalini Devarajan","url":"https:\/\/www.guvi.in\/blog\/author\/vishalini\/"},"thumbnailURL":"https:\/\/www.guvi.in\/blog\/wp-content\/uploads\/2026\/07\/01-6-300x116.webp","_links":{"self":[{"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/posts\/120077"}],"collection":[{"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/comments?post=120077"}],"version-history":[{"count":7,"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/posts\/120077\/revisions"}],"predecessor-version":[{"id":135181,"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/posts\/120077\/revisions\/135181"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/media\/135177"}],"wp:attachment":[{"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/media?parent=120077"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/categories?post=120077"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.guvi.in\/blog\/wp-json\/wp\/v2\/tags?post=120077"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}