[英]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.