{"id":163,"date":"2007-07-23T23:06:27","date_gmt":"2007-07-24T06:06:27","guid":{"rendered":"https:\/\/dubinko.info\/blog\/2007\/07\/23\/prototypical-inheritance-in-python\/"},"modified":"2007-07-23T23:06:27","modified_gmt":"2007-07-24T06:06:27","slug":"prototypical-inheritance-in-python","status":"publish","type":"post","link":"https:\/\/dubinko.info\/blog\/2007\/07\/prototypical-inheritance-in-python\/","title":{"rendered":"Prototypical inheritance in Python"},"content":{"rendered":"<p>Based on Doug Crockford&#8217;s chapter in <a href=\"http:\/\/www.amazon.com\/exec\/obidos\/ASIN\/0596510047\/dubinkoinfo-20\">Beautiful Code<\/a>, I wanted to take a crack at implementing <a href=\"http:\/\/javascript.crockford.com\/tdop\/tdop.html\">Top Down Operator Precedence<\/a> in Python. After all, Python and JavaScript are quite similar, right?<\/p>\n<p>Not really. As you can imagine, Doug&#8217;s code makes great use of JavaScript&#8217;s strengths, in this case the ability to assign new methods to any object. For an initial version, I wanted to make the Python version behave the same way, as opposed to a deeper redesign that would be more pythonic. (That would come later.)<br \/>\nMy initial approach was a <code>__getattr__<\/code> method that consisted simply of <code>return getattr(self.prototype, name)<\/code>. When reattaching a new method to an instance, I needed an extra wrapper, done through a <code>wrap<\/code> method which consisted of <code>return new.instancemethod(method, self, self.__class__)<\/code>. It would be used like this: <code>obj.method = obj.wrap(some_func)<\/code>.<\/p>\n<p>This caused a subtle problem that took me a while to track down. In JavaScript, any function can reference the built-in <code>this<\/code> variable, which works whether the function is bound to some specific object or not. (Even global functions are bound to the global object.) But Python doesn&#8217;t have such a keyword. The language prefers the explicit, and uses a explicitly passed parameter, called by convention <code>self<\/code>. The call to wrap a specific function also had the effect of binding the <code>self<\/code> parameter to that particular object; even if it later became a prototype for some other object. This manifested itself as all kinds of broken behavior. For example, the original code has a global <code>scope<\/code> object, and every time a new scope was entered, the global pointed to a newer object that kept a reference to the rest of the scope chain. But in the object&#8217;s methods, <code>self<\/code> pointed to something different than the global. Messy.<\/p>\n<p>Before I get into solutions, I&#8217;d like to see what readers say. How would you go about implementing prototypical inheritance in Python? And what is a more pythonic way to accomplish the same thing? Comment below. Thanks! -m<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Based on Doug Crockford&#8217;s chapter in Beautiful Code, I wanted to take a crack at implementing Top Down Operator Precedence in Python. After all, Python and JavaScript are quite similar, right? Not really. As you can imagine, Doug&#8217;s code makes great use of JavaScript&#8217;s strengths, in this case the ability to assign new methods to&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[24,22,1],"tags":[],"class_list":["post-163","post","type-post","status-publish","format-standard","hentry","category-python","category-software","category-stuff"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Based on Doug Crockford&#039;s chapter in Beautiful Code, I wanted to take a crack at implementing Top Down Operator Precedence in Python. After all, Python and JavaScript are quite similar, right? Not really. As you can imagine, Doug&#039;s code makes great use of JavaScript&#039;s strengths, in this case the ability to assign new methods to\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"mdubinko\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/dubinko.info\/blog\/2007\/07\/prototypical-inheritance-in-python\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"MicahLogic Queryopticon | Yields undecidable when preceded by its quotation\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Prototypical inheritance in Python | MicahLogic Queryopticon\" \/>\n\t\t<meta property=\"og:description\" content=\"Based on Doug Crockford&#039;s chapter in Beautiful Code, I wanted to take a crack at implementing Top Down Operator Precedence in Python. After all, Python and JavaScript are quite similar, right? Not really. As you can imagine, Doug&#039;s code makes great use of JavaScript&#039;s strengths, in this case the ability to assign new methods to\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/dubinko.info\/blog\/2007\/07\/prototypical-inheritance-in-python\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2007-07-24T06:06:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2007-07-24T06:06:27+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Prototypical inheritance in Python | MicahLogic Queryopticon\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Based on Doug Crockford&#039;s chapter in Beautiful Code, I wanted to take a crack at implementing Top Down Operator Precedence in Python. After all, Python and JavaScript are quite similar, right? Not really. As you can imagine, Doug&#039;s code makes great use of JavaScript&#039;s strengths, in this case the ability to assign new methods to\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2007\\\/07\\\/prototypical-inheritance-in-python\\\/#article\",\"name\":\"Prototypical inheritance in Python | MicahLogic Queryopticon\",\"headline\":\"Prototypical inheritance in Python\",\"author\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/#organization\"},\"datePublished\":\"2007-07-23T23:06:27-07:00\",\"dateModified\":\"2007-07-23T23:06:27-07:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2007\\\/07\\\/prototypical-inheritance-in-python\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2007\\\/07\\\/prototypical-inheritance-in-python\\\/#webpage\"},\"articleSection\":\"python, software, stuff\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2007\\\/07\\\/prototypical-inheritance-in-python\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/dubinko.info\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/software\\\/#listItem\",\"name\":\"software\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/software\\\/#listItem\",\"position\":2,\"name\":\"software\",\"item\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/software\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/software\\\/python\\\/#listItem\",\"name\":\"python\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/software\\\/python\\\/#listItem\",\"position\":3,\"name\":\"python\",\"item\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/software\\\/python\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2007\\\/07\\\/prototypical-inheritance-in-python\\\/#listItem\",\"name\":\"Prototypical inheritance in Python\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/software\\\/#listItem\",\"name\":\"software\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2007\\\/07\\\/prototypical-inheritance-in-python\\\/#listItem\",\"position\":4,\"name\":\"Prototypical inheritance in Python\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/software\\\/python\\\/#listItem\",\"name\":\"python\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/#organization\",\"name\":\"MicahLogic Queryopticon\",\"description\":\"Yields undecidable when preceded by its quotation\",\"url\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"mdubinko\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2007\\\/07\\\/prototypical-inheritance-in-python\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c1160c0ab9ce581a55013f96fd61356e166ffc9a00666a5062bc8121922fcdcd?s=96&d=retro&r=g\",\"width\":96,\"height\":96,\"caption\":\"mdubinko\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2007\\\/07\\\/prototypical-inheritance-in-python\\\/#webpage\",\"url\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2007\\\/07\\\/prototypical-inheritance-in-python\\\/\",\"name\":\"Prototypical inheritance in Python | MicahLogic Queryopticon\",\"description\":\"Based on Doug Crockford's chapter in Beautiful Code, I wanted to take a crack at implementing Top Down Operator Precedence in Python. After all, Python and JavaScript are quite similar, right? Not really. As you can imagine, Doug's code makes great use of JavaScript's strengths, in this case the ability to assign new methods to\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2007\\\/07\\\/prototypical-inheritance-in-python\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2007-07-23T23:06:27-07:00\",\"dateModified\":\"2007-07-23T23:06:27-07:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/\",\"name\":\"MicahLogic Queryopticon\",\"description\":\"Yields undecidable when preceded by its quotation\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Prototypical inheritance in Python | MicahLogic Queryopticon","description":"Based on Doug Crockford's chapter in Beautiful Code, I wanted to take a crack at implementing Top Down Operator Precedence in Python. After all, Python and JavaScript are quite similar, right? Not really. As you can imagine, Doug's code makes great use of JavaScript's strengths, in this case the ability to assign new methods to","canonical_url":"https:\/\/dubinko.info\/blog\/2007\/07\/prototypical-inheritance-in-python\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/dubinko.info\/blog\/2007\/07\/prototypical-inheritance-in-python\/#article","name":"Prototypical inheritance in Python | MicahLogic Queryopticon","headline":"Prototypical inheritance in Python","author":{"@id":"https:\/\/dubinko.info\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/dubinko.info\/blog\/#organization"},"datePublished":"2007-07-23T23:06:27-07:00","dateModified":"2007-07-23T23:06:27-07:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/dubinko.info\/blog\/2007\/07\/prototypical-inheritance-in-python\/#webpage"},"isPartOf":{"@id":"https:\/\/dubinko.info\/blog\/2007\/07\/prototypical-inheritance-in-python\/#webpage"},"articleSection":"python, software, stuff"},{"@type":"BreadcrumbList","@id":"https:\/\/dubinko.info\/blog\/2007\/07\/prototypical-inheritance-in-python\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog#listItem","position":1,"name":"Home","item":"https:\/\/dubinko.info\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/tags\/software\/#listItem","name":"software"}},{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/tags\/software\/#listItem","position":2,"name":"software","item":"https:\/\/dubinko.info\/blog\/tags\/software\/","nextItem":{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/tags\/software\/python\/#listItem","name":"python"},"previousItem":{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/tags\/software\/python\/#listItem","position":3,"name":"python","item":"https:\/\/dubinko.info\/blog\/tags\/software\/python\/","nextItem":{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/2007\/07\/prototypical-inheritance-in-python\/#listItem","name":"Prototypical inheritance in Python"},"previousItem":{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/tags\/software\/#listItem","name":"software"}},{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/2007\/07\/prototypical-inheritance-in-python\/#listItem","position":4,"name":"Prototypical inheritance in Python","previousItem":{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/tags\/software\/python\/#listItem","name":"python"}}]},{"@type":"Organization","@id":"https:\/\/dubinko.info\/blog\/#organization","name":"MicahLogic Queryopticon","description":"Yields undecidable when preceded by its quotation","url":"https:\/\/dubinko.info\/blog\/"},{"@type":"Person","@id":"https:\/\/dubinko.info\/blog\/author\/admin\/#author","url":"https:\/\/dubinko.info\/blog\/author\/admin\/","name":"mdubinko","image":{"@type":"ImageObject","@id":"https:\/\/dubinko.info\/blog\/2007\/07\/prototypical-inheritance-in-python\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/c1160c0ab9ce581a55013f96fd61356e166ffc9a00666a5062bc8121922fcdcd?s=96&d=retro&r=g","width":96,"height":96,"caption":"mdubinko"}},{"@type":"WebPage","@id":"https:\/\/dubinko.info\/blog\/2007\/07\/prototypical-inheritance-in-python\/#webpage","url":"https:\/\/dubinko.info\/blog\/2007\/07\/prototypical-inheritance-in-python\/","name":"Prototypical inheritance in Python | MicahLogic Queryopticon","description":"Based on Doug Crockford's chapter in Beautiful Code, I wanted to take a crack at implementing Top Down Operator Precedence in Python. After all, Python and JavaScript are quite similar, right? Not really. As you can imagine, Doug's code makes great use of JavaScript's strengths, in this case the ability to assign new methods to","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/dubinko.info\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/dubinko.info\/blog\/2007\/07\/prototypical-inheritance-in-python\/#breadcrumblist"},"author":{"@id":"https:\/\/dubinko.info\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/dubinko.info\/blog\/author\/admin\/#author"},"datePublished":"2007-07-23T23:06:27-07:00","dateModified":"2007-07-23T23:06:27-07:00"},{"@type":"WebSite","@id":"https:\/\/dubinko.info\/blog\/#website","url":"https:\/\/dubinko.info\/blog\/","name":"MicahLogic Queryopticon","description":"Yields undecidable when preceded by its quotation","inLanguage":"en-US","publisher":{"@id":"https:\/\/dubinko.info\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"MicahLogic Queryopticon | Yields undecidable when preceded by its quotation","og:type":"article","og:title":"Prototypical inheritance in Python | MicahLogic Queryopticon","og:description":"Based on Doug Crockford's chapter in Beautiful Code, I wanted to take a crack at implementing Top Down Operator Precedence in Python. After all, Python and JavaScript are quite similar, right? Not really. As you can imagine, Doug's code makes great use of JavaScript's strengths, in this case the ability to assign new methods to","og:url":"https:\/\/dubinko.info\/blog\/2007\/07\/prototypical-inheritance-in-python\/","article:published_time":"2007-07-24T06:06:27+00:00","article:modified_time":"2007-07-24T06:06:27+00:00","twitter:card":"summary","twitter:title":"Prototypical inheritance in Python | MicahLogic Queryopticon","twitter:description":"Based on Doug Crockford's chapter in Beautiful Code, I wanted to take a crack at implementing Top Down Operator Precedence in Python. After all, Python and JavaScript are quite similar, right? Not really. As you can imagine, Doug's code makes great use of JavaScript's strengths, in this case the ability to assign new methods to"},"aioseo_meta_data":{"post_id":"163","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-02-04 08:13:20","updated":"2025-12-10 02:33:28","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/dubinko.info\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/dubinko.info\/blog\/tags\/software\/\" title=\"software\">software<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/dubinko.info\/blog\/tags\/software\/python\/\" title=\"python\">python<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tPrototypical inheritance in Python\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/dubinko.info\/blog"},{"label":"software","link":"https:\/\/dubinko.info\/blog\/tags\/software\/"},{"label":"python","link":"https:\/\/dubinko.info\/blog\/tags\/software\/python\/"},{"label":"Prototypical inheritance in Python","link":"https:\/\/dubinko.info\/blog\/2007\/07\/prototypical-inheritance-in-python\/"}],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8eo8l-2D","jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/posts\/163","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/comments?post=163"}],"version-history":[{"count":0,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/posts\/163\/revisions"}],"wp:attachment":[{"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/media?parent=163"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/categories?post=163"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/tags?post=163"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}