google提供的python风格指南-属性说明 问题:

google提供的python风格指南-属性说明 问题:,python,Python,请详细说明关于属性的Goolge Python Stile指南: 如果属性本身未被重写,则具有属性的继承可以是不明显的 确保属性调用子类中重写的方法 不明显的意味着什么?潜在的问题是什么 确保被属性调用的重写方法是什么意思?潜在的问题是什么 2.13.4决定 如果属性本身未被覆盖,则带有属性的继承可能是不明显的。因此,必须确保间接调用访问器方法,以确保子类中重写的方法由属性调用(使用模板方法设计模式) 不明显的是,当您从类继承时,必须特别考虑如何重写子类中的属性,因为定义可能分布在多个方法之间

请详细说明关于属性的Goolge Python Stile指南:

如果属性本身未被重写,则具有属性的继承可以是不明显的

确保属性调用子类中重写的方法

  • 不明显的意味着什么?潜在的问题是什么
  • 确保被属性调用的重写方法是什么意思?潜在的问题是什么
  • 2.13.4决定
    如果属性本身未被覆盖,则带有属性的继承可能是不明显的。因此,必须确保间接调用访问器方法,以确保子类中重写的方法由属性调用(使用模板方法设计模式)


    不明显的是,当您从类继承时,必须特别考虑如何重写子类中的属性,因为定义可能分布在多个方法之间

    如果以不同方式定义了实现
    区域
    属性的
    Square
    子类,则需要执行以下操作之一:

  • 确保从不直接调用
    Square.\u get\u area()
    Square.\u set\u area()
    方法,只能通过属性方法调用。然后可以在子类中定义新属性
  • 重写子类中的
    \u get\u area()
    \u set\u area()
    方法。然后就不需要重新定义属性了——它们将被正常继承,但将调用子类的内部方法

  • 这两个问题都不复杂,但当从具有属性的类继承时,可能需要额外检查这些问题。

    我看不到问题1的答案。为什么带有属性的继承是不明显的?如果您不解释这一点,那么首先就没有任何理由引入
    \u get\u area
    \u set\u area
    。这并不明显,因为您必须注意属性和内部方法之间的关系。我认为从剩下的答案中可以明显看出这一点。
    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