title: python style guide by google - clarification on properties
body: <h1>Question</h1>
  <p>Please elaborate on the Goolge Python Stile Guide on properties:</p>
  <blockquote>
  <p>Inheritance with properties can be <strong>non-obvious</strong> if the property itself is not overridden</p>
  </blockquote>
  <blockquote>
  <p>ensure methods overridden in subclasses are called by the property</p>
  </blockquote>
  <ol>
  <li>What does <strong>non-obvious</strong> mean and what are potential issues?</li>
  <li>What does <strong>ensure overridden method to be called by property</strong> mean and what are potential issues?</li>
  </ol>
  <p><a href="https://google.github.io/styleguide/pyguide.html#2134-decision" rel="nofollow noreferrer">Google Python Style Guide 2.13 Properties</a></p>
  <blockquote>
  <p>2.13.4 Decision<br>
  Inheritance with properties can be <strong>non-obvious if the property itself is not overridden</strong>. Thus one must make sure that accessor methods are called indirectly <strong>to ensure methods overridden in subclasses are called by the property</strong> (using the template method design pattern).</p>
  </blockquote>
  <pre><code>import math
  
       class Square:
           &quot;&quot;&quot;A square with two properties: a writable area and a read-only perimeter.
  
           To use:
           &gt;&gt;&gt; sq = Square(3)
           &gt;&gt;&gt; sq.area
           9
           &gt;&gt;&gt; sq.perimeter
           12
           &gt;&gt;&gt; sq.area = 16
           &gt;&gt;&gt; sq.side
           4
           &gt;&gt;&gt; sq.perimeter
           16
           &quot;&quot;&quot;
  
           def __init__(self, side):
               self.side = side
  
           @property
           def area(self):
               &quot;&quot;&quot;Area of the square.&quot;&quot;&quot;
               return self._get_area()
  
           @area.setter
           def area(self, area):
               return self._set_area(area)
  
           def _get_area(self):
               &quot;&quot;&quot;Indirect accessor to calculate the 'area' property.&quot;&quot;&quot;
               return self.side ** 2
  
           def _set_area(self, area):
               &quot;&quot;&quot;Indirect setter to set the 'area' property.&quot;&quot;&quot;
               self.side = math.sqrt(area)
  
           @property
           def perimeter(self):
               return self.side * 4
  </code></pre>