繁体   English   中英

python 谷歌风格指南 - 属性说明

[英]python style guide by google - clarification on properties

请详细说明有关属性的 Goolge Python Stile 指南:

如果属性本身未被覆盖,则 Inheritance 属性可以是非显而易见

确保子类中覆盖的方法由属性调用

  1. 不明显是什么意思,潜在问题是什么?
  2. 确保被属性调用的重写方法意味着什么?潜在的问题是什么?

Google Python 样式指南 2.13 属性

2.13.4 决定
如果属性本身未被覆盖,则 Inheritance 属性可能不明显 因此,必须确保间接调用访问器方法,以确保属性调用子类中重写的方法(使用模板方法设计模式)。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM