簡體   English   中英

getter和setter的Google Style Guide屬性

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

我有兩個問題:

  1. 使用三個下划線“間接” ___get_area___set_area以及兩個下划線的優點是什么,而不是直接使用兩個下划線?

  2. 為什么使用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)

然后, gettersetterdeleter裝飾器屬性僅在Python 2.6中添加。 樣式指南必須是為較舊的Python版本編寫的。

對於2.6及更高版本,請改為使用@propname.setter模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM