{"id":24575,"date":"2019-05-20T12:15:17","date_gmt":"2019-05-20T09:15:17","guid":{"rendered":"https:\/\/www.webcodegeeks.com\/?p=24575"},"modified":"2019-05-20T11:12:22","modified_gmt":"2019-05-20T08:12:22","slug":"better-unbound-python-descriptors","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/","title":{"rendered":"Better Unbound Python Descriptors"},"content":{"rendered":"\n<p>Welcome back from another hiatus! This post is a facepalm post because I recently realized that I\u2019ve been an idiot for so long. I have a tendency to make things more complicated than they need to be, as can be seen in my articles <a href=\"https:\/\/www.webcodegeeks.com\/python\/instance-level-properties-python\/\">about<\/a> <a href=\"https:\/\/www.webcodegeeks.com\/python\/another-look-instance-level-properties-python\/\">instance<\/a> <a href=\"https:\/\/www.webcodegeeks.com\/python\/using-new-python-instance-properties\/\">properties<\/a>.<\/p>\n\n\n\n<p>I\u2019ve briefly mentioned unbound attributes (<code>Class.attr<\/code> returns a function that you pass an instance into to look up the the value of that instance\u2019s version of the attribute) with descriptors a <a href=\"https:\/\/programmingideaswithjake.wordpress.com\/2015\/12\/26\/excerpt-from-python-descriptors-a-comprehensive-guide-chapter-6-which-methods-are-needed\/\">time<\/a> or <a href=\"https:\/\/www.webcodegeeks.com\/python\/another-look-instance-level-properties-python\/\">two<\/a> and they always ended up using a whole new object to represent the unbound attribute. In the example given, I returned a local function to use as the unbound attribute; in the <code>descriptor-tools<\/code> library that goes along with the book, I implemented it with an <code>UnboundAttribute<\/code> type, which allowed it to easily carry extra data (such as the descriptor object reference); then I discovered <code>attrgetter<\/code> in the <code>operator<\/code> module, so I substituted that in instead. But there was one big obvious solution I was missing.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><b>Some Background<\/b><\/h2>\n\n\n\n<p>When implementing the <code>__get__()<\/code> method of a descriptor, the convention was to always return the descriptor itself if an instance was not given. When I started espousing using unbound attributes instead, I always had one caveat: since the convention for so long has been to return the descriptor, it can go against the Principle of Least Astonishment to return something else. So, I always advised using it with a grain of salt.<\/p>\n\n\n\n<p>But I myself didn\u2019t care; I had no real use for returning the descriptor. Really, the only thing that bugged me was that we had to create an object that had barely any use. I really love the style of having lots of small classes doing their things and letting the runtime largely deal with the repercussions, but it always hurt a little bit inside, since this object seemed like a waste.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><b>Good News!<\/b><\/h2>\n\n\n\n<p>Well, after all these years, I\u2019ve finally realized how much of an idiot I am and that none of these issues have to be issues at all!<\/p>\n\n\n\n<p>The solution? Return the descriptor and give it a <code>__call__()<\/code> method that takes in the instance and delegates to the <code>__get__()<\/code> method, as shown:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted brush:php\">class MyDescriptor:\n\n    def __init__(self, \u2026):\n\n      ...\n\n&nbsp;\n\n    def __call__(self, instance):\n\n        return self.__get__(instance)\n\n&nbsp;\n\n    def __get__(self, instance, owner=None):\n\n        if instance is None:\n\n            return self\n\n        else:\n\n          ...<\/pre>\n\n\n\n<p>This also finally gave me a good excuse for using the default value of <code>None<\/code> for the <code>owner<\/code> parameter!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><b>But\u2026<\/b><\/h2>\n\n\n\n<p>There is still one caveat to this version of an unbound attribute. If the descriptor has another use for <code>__call__()<\/code>, then using it for this either requires changing the unbound attribute to return some other implementation (one that allows the user to get access to the descriptor, or else having the <code>__call__()<\/code> method is useless) or you\u2019ll have to use a normal method instead of <code>__call__()<\/code> for that use case.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><b>Outro<\/b><\/h2>\n\n\n\n<p>As always, the KISS principle (Keep It Simple, Stupid) prevails. Not only is it simpler in almost every way, but it even makes it so you can ignore all the likely problems.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><b>Updates<\/b><\/h2>\n\n\n\n<p>Remember how I said I\u2019d rewrite a bunch of Java articles using Kotlin and\/or Python? I haven\u2019t even started that. And I probably won\u2019t do that for a while, if ever. I feel bad, but my blog has simply not been a big priority to me for a while. I want to get back into doing it regularly, but that\u2019s not likely. I have another article I\u2019ve been wanting to do for a long time, but I really don\u2019t feel like writing it because it\u2019ll be a <i>lot<\/i> of example code, and example code always ends up being a hassle with my workflow.<\/p>\n\n\n\n<p>I recently lost my job, so right now I\u2019m focusing on padding my resume with projects and finishing all my planned updates to the <code>descriptor-tools<\/code> library (which is what inspired this article). Maybe the other projects will do the same thing. I also plan to work on a video for Apress (the publisher of my book) that take some of my book\u2019s content and put it into video form. I may even touch on this article\u2019s topic in those. I\u2019m still not sure what it will be about, but some supplemental income will be nice.<\/p>\n\n\n\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>Published on Web Code Geeks with permission by Jacob Zimmerman, partner at our <a href=\"\/\/www.webcodegeeks.com\/join-us\/wcg\/\" target=\"_blank\" rel=\"noopener noreferrer\">WCG program<\/a>. See the original article here: <a href=\"https:\/\/programmingideaswithjake.wordpress.com\/2019\/05\/18\/better-unbound-python-descriptors\/\" target=\"_blank\" rel=\"noopener noreferrer\">Better Unbound Python Descriptors<\/a><\/p>\n<p>Opinions expressed by Web Code Geeks contributors are their own.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Welcome back from another hiatus! This post is a facepalm post because I recently realized that I\u2019ve been an idiot for so long. I have a tendency to make things more complicated than they need to be, as can be seen in my articles about instance properties. I\u2019ve briefly mentioned unbound attributes (Class.attr returns a &hellip;<\/p>\n","protected":false},"author":51,"featured_media":1651,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[53],"tags":[],"class_list":["post-24575","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Better Unbound Python Descriptors - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"Interested to learn about Python Descriptors? Check our article explaining through examples how to use better unbound Python descriptors\" \/>\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.webcodegeeks.com\/python\/better-unbound-python-descriptors\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Better Unbound Python Descriptors - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"Interested to learn about Python Descriptors? Check our article explaining through examples how to use better unbound Python descriptors\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2019-05-20T09:15:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Jacob Zimmerman\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/jacobz_20\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jacob Zimmerman\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/\"},\"author\":{\"name\":\"Jacob Zimmerman\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/f54a53cfb8523f4ef6012aa63f075c39\"},\"headline\":\"Better Unbound Python Descriptors\",\"datePublished\":\"2019-05-20T09:15:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/\"},\"wordCount\":729,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"articleSection\":[\"Python\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/\",\"name\":\"Better Unbound Python Descriptors - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"datePublished\":\"2019-05-20T09:15:17+00:00\",\"description\":\"Interested to learn about Python Descriptors? Check our article explaining through examples how to use better unbound Python descriptors\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/python\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Better Unbound Python Descriptors\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/f54a53cfb8523f4ef6012aa63f075c39\",\"name\":\"Jacob Zimmerman\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/2dfdd9e2d35ed2224faf73968f8c597b5489fc345287e06e2571d3935a6bcc86?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/2dfdd9e2d35ed2224faf73968f8c597b5489fc345287e06e2571d3935a6bcc86?s=96&d=mm&r=g\",\"caption\":\"Jacob Zimmerman\"},\"description\":\"Jacob is a certified Java programmer (level 1) and Python enthusiast. He loves to solve large problems with programming and considers himself pretty good at design.\",\"sameAs\":[\"https:\/\/programmingideaswithjake.wordpress.com\/\",\"https:\/\/x.com\/https:\/\/twitter.com\/jacobz_20\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/jacob-zimmerman\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Better Unbound Python Descriptors - Web Code Geeks - 2026","description":"Interested to learn about Python Descriptors? Check our article explaining through examples how to use better unbound Python descriptors","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.webcodegeeks.com\/python\/better-unbound-python-descriptors\/","og_locale":"en_US","og_type":"article","og_title":"Better Unbound Python Descriptors - Web Code Geeks - 2026","og_description":"Interested to learn about Python Descriptors? Check our article explaining through examples how to use better unbound Python descriptors","og_url":"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_published_time":"2019-05-20T09:15:17+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","type":"image\/jpeg"}],"author":"Jacob Zimmerman","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/jacobz_20","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Jacob Zimmerman","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/"},"author":{"name":"Jacob Zimmerman","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/f54a53cfb8523f4ef6012aa63f075c39"},"headline":"Better Unbound Python Descriptors","datePublished":"2019-05-20T09:15:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/"},"wordCount":729,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","articleSection":["Python"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/","url":"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/","name":"Better Unbound Python Descriptors - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","datePublished":"2019-05-20T09:15:17+00:00","description":"Interested to learn about Python Descriptors? Check our article explaining through examples how to use better unbound Python descriptors","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/python\/better-unbound-python-descriptors\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Python","item":"https:\/\/www.webcodegeeks.com\/category\/python\/"},{"@type":"ListItem","position":3,"name":"Better Unbound Python Descriptors"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/f54a53cfb8523f4ef6012aa63f075c39","name":"Jacob Zimmerman","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/2dfdd9e2d35ed2224faf73968f8c597b5489fc345287e06e2571d3935a6bcc86?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2dfdd9e2d35ed2224faf73968f8c597b5489fc345287e06e2571d3935a6bcc86?s=96&d=mm&r=g","caption":"Jacob Zimmerman"},"description":"Jacob is a certified Java programmer (level 1) and Python enthusiast. He loves to solve large problems with programming and considers himself pretty good at design.","sameAs":["https:\/\/programmingideaswithjake.wordpress.com\/","https:\/\/x.com\/https:\/\/twitter.com\/jacobz_20"],"url":"https:\/\/www.webcodegeeks.com\/author\/jacob-zimmerman\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/24575","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/51"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=24575"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/24575\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/1651"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=24575"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=24575"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=24575"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}