[英]python style guide by google - clarification on properties
请详细说明有关属性的 Goolge Python Stile 指南:
如果属性本身未被覆盖,则 Inheritance 属性可以是非显而易见的
确保子类中覆盖的方法由属性调用
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
子类,则需要执行以下任一操作:
Square._get_area()
和Square._set_area()
方法,只能通过属性方法调用。 然后你可以在子类中定义新的属性。_get_area()
和_set_area()
方法。 那么就没有必要重新定义属性——它们将被正常继承,但会调用子类的内部方法。这些都不复杂,但是当从具有属性的 class 继承时,您可能需要检查一些额外的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.