python - google 的 python 风格指南 - 属性说明
问题描述
问题
请详细说明关于属性的 Goolge Python Stile Guide:
如果属性本身未被覆盖,则属性继承可能不明显
确保子类中重写的方法由属性调用
- 不明显是什么意思,潜在的问题是什么?
- 确保通过属性调用的覆盖方法是什么意思以及潜在的问题是什么?
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
解决方案
不明显的是,当您从类继承时,您必须特别考虑如何覆盖子类中的属性,因为定义可能分布在多个方法之间。
如果您定义以不同Square
方式实现该area
属性的子类,则需要执行以下任一操作:
- 确保永远不会直接调用
Square._get_area()
andSquare._set_area()
方法,只能通过属性方法调用。然后您可以在子类中定义新属性。 - 覆盖子类中的
_get_area()
and_set_area()
方法。然后不需要重新定义属性——它们会被正常继承,但会调用子类的内部方法。
这些都不复杂,但在从具有属性的类继承时可能需要检查一些额外的东西。
推荐阅读
- c++ - 由于循环依赖,C++ 未知类型名称
- javascript - 如何在 php 中启用启用 javascript 的倒数计时器?
- reactjs - 值未正确传递给函数
- android - 离散傅里叶变换 OpenCV 无法在 Android 上运行
- angular - 一旦我知道 Angular 中的音频元素上存在对象键,就运行函数
- php - 求和 $n 次递增的数学循环
- python - rs-convert 不会从 rosbag 文件生成 .ply 文件
- python - SSE2 指令,PMULUDQ 乘法题
- image - AHK:尝试在 GUI 中的另一张图片上添加具有透明背景的图片
- python - AttributeError:模块'turtle'在spyder中没有属性'screen'?