首页 > 解决方案 > google 的 python 风格指南 - 属性说明

问题描述

问题

请详细说明关于属性的 Goolge Python Stile Guide:

如果属性本身未被覆盖,则属性继承可能不明显

确保子类中重写的方法由属性调用

  1. 不明显是什么意思,潜在的问题是什么?
  2. 确保通过属性调用的覆盖方法是什么意思以及潜在的问题是什么?

Google Python 样式指南 2.13 属性

2.13.4如果属性本身没有被覆盖
,带有属性的决策继承可能是不明显的。因此,必须确保间接调用访问器方法,以确保在子类中覆盖的方法由属性调用(使用模板方法设计模式)。

import math

     class Square:
         """A square with two properties: a writable area and a read-only perimeter.

         To use:
         >>> sq = Square(3)
         >>> sq.area
         9
         >>> sq.perimeter
         12
         >>> sq.area = 16
         >>> sq.side
         4
         >>> sq.perimeter
         16
         """

         def __init__(self, side):
             self.side = side

         @property
         def area(self):
             """Area of the square."""
             return self._get_area()

         @area.setter
         def area(self, area):
             return self._set_area(area)

         def _get_area(self):
             """Indirect accessor to calculate the 'area' property."""
             return self.side ** 2

         def _set_area(self, area):
             """Indirect setter to set the 'area' property."""
             self.side = math.sqrt(area)

         @property
         def perimeter(self):
             return self.side * 4

标签: python

解决方案


不明显的是,当您从类继承时,您必须特别考虑如何覆盖子类中的属性,因为定义可能分布在多个方法之间。

如果您定义以不同Square方式实现该area属性的子类,则需要执行以下任一操作:

  1. 确保永远不会直接调用Square._get_area()andSquare._set_area()方法,只能通过属性方法调用。然后您可以在子类中定义新属性。
  2. 覆盖子类中的_get_area()and_set_area()方法。然后不需要重新定义属性——它们会被正常继承,但会调用子类的内部方法。

这些都不复杂,但在从具有属性的类继承时可能需要检查一些额外的东西。


推荐阅读