用于获取器和设置器的 Google 样式指南属性

Posted

技术标签:

【中文标题】用于获取器和设置器的 Google 样式指南属性【英文标题】:Google Style Guide properties for getters and setters 【发布时间】:2014-04-02 04:06:22 【问题描述】:

我对@9​​87654321@ 中的一项建议感到好奇。

在其中,他们给出了以下示例:

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)
    

【问题讨论】:

【参考方案1】:

在风格指南中,他们确实给出了理由:

如果属性本身未被覆盖,则属性继承可能不明显。因此,必须确保间接调用访问器方法,以确保子类中覆盖的方法由属性调用(使用模板方法 DP)。

(其中 Template Method DP 是 Template Method Design Pattern(幻灯片由 Google 的 Pythonista extraordinaire Alex Martelli 提供)。

所以他们希望给子类一个覆盖实现的机会,并给property 三个下划线版本来调用双下划线方法,以便您可以覆盖这些方法。在这种情况下,您必须拼出损坏的名称:

class WonkySquare(Square):
    def _Square__get_area(self):
        return self.square ** 2 + 0.5

显然提出这个方案的人从来不知道您可以只覆盖属性的 getter 或 setter,请参阅 Python overriding getter without 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 模式。

【讨论】:

谢谢!那么,如果我对您的理解正确,您建议按照我在问题 #2 中所说的(即@property 和@area.setter),然后在 ProperlySubclassedSquare 中使用您的方法进行子类化? @mdkess:绝对;几乎可以肯定,样式指南是为较旧的 Python 版本编写的。

以上是关于用于获取器和设置器的 Google 样式指南属性的主要内容,如果未能解决你的问题,请参考以下文章

CSS 属性选择器和区分大小写的“类型”属性与虚构属性

C++开发EOS基础指南:迭代器和Lambda表达式

CSS选择器与优先级详解(一)

CSS选择器和权重计算

零基础入门前端系列—基础选择器和字体属性

css选择器都有哪些?各种选择器优先级大小顺序