[英]Google Style Guide properties for getters and setters
我很好奇Google Python樣式指南中有關屬性的建議之一。
在其中,他們給出了以下示例:
class Square(object):
"""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
def __get_area(self):
"""Calculates the 'area' property."""
return self.side ** 2
def ___get_area(self):
"""Indirect accessor for 'area' property."""
return self.__get_area()
def __set_area(self, area):
"""Sets the 'area' property."""
self.side = math.sqrt(area)
def ___set_area(self, area):
"""Indirect setter for 'area' property."""
self.__set_area(area)
area = property(___get_area, ___set_area,
doc="""Gets or sets the area of the square.""")
@property
def perimeter(self):
return self.side * 4
我有兩個問題:
使用三個下划線“間接” ___get_area
和___set_area
以及兩個下划線的優點是什么,而不是直接使用兩個下划線?
為什么使用property()
作為這種雙重和三重下划線方法的方法,而不是做類似的事情:
@property def area(self): return self.side ** 2 @area.setter def area(self, value): self.side = math.sqrt(value)
在風格指南中,他們給出了一個理由:
如果不覆蓋屬性本身,則具有屬性的繼承可能不明顯。 因此,必須確保間接調用訪問器方法以確保屬性調用子類中重寫的方法(使用模板方法DP)。
(其中模板方法DP是模板方法設計模式 (Alex Martelli的幻燈片,Google的Pythonista extraordinaire)。
因此,他們希望為子類提供覆蓋實現的機會,並為property
三重下划線版本來調用雙下划線方法,以便您可以覆蓋它們。 在這種情況下,您必須拼出錯誤的名稱:
class WonkySquare(Square):
def _Square__get_area(self):
return self.square ** 2 + 0.5
顯然,提出這個方案的人從來不知道你可以只覆蓋一個屬性的getter或setter,看看Python覆蓋getter而沒有setter :
class ProperlySubclassedSquare(Square):
@Square.area.getter
def area(self):
return self.square ** 2 + (0.5 - 0.5)
然后, getter
, setter
和deleter
裝飾器屬性僅在Python 2.6中添加。 樣式指南必須是為較舊的Python版本編寫的。
對於2.6及更高版本,請改為使用@propname.setter
模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.