gpt4 book ai didi

python - getter 和 setter 的谷歌风格指南属性

转载 作者:太空狗 更新时间:2023-10-30 00:32:10 27 4
gpt4 key购买 nike

我对 Google Python style guide concerning properties 中的其中一项建议感到好奇.

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

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)

最佳答案

在风格指南中他们给出了一个理由:

Inheritance with properties can be non-obvious if the property itself is not overridden. Thus one must make sure that accessor methods are called indirectly to ensure methods overridden in subclasses are called by the property (using the Template Method DP).

(其中 Template Method DPTemplate 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 模式。

关于python - getter 和 setter 的谷歌风格指南属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22107289/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com