簡體   English   中英

python 谷歌風格指南 - 屬性說明

[英]python style guide by google - clarification on properties

請詳細說明有關屬性的 Goolge Python Stile 指南:

如果屬性本身未被覆蓋,則 Inheritance 屬性可以是非顯而易見

確保子類中覆蓋的方法由屬性調用

  1. 不明顯是什么意思,潛在問題是什么?
  2. 確保被屬性調用的重寫方法意味着什么?潛在的問題是什么?

Google Python 樣式指南 2.13 屬性

2.13.4 決定
如果屬性本身未被覆蓋,則 Inheritance 屬性可能不明顯 因此,必須確保間接調用訪問器方法,以確保屬性調用子類中重寫的方法(使用模板方法設計模式)。

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

不明顯的是,當您從 class 繼承時,您必須特別考慮如何覆蓋子類中的屬性,因為定義可能分布在多個方法之間。

如果您定義以不同方式實現area屬性的Square子類,則需要執行以下任一操作:

  1. 確保永遠不會直接調用Square._get_area()Square._set_area()方法,只能通過屬性方法調用。 然后你可以在子類中定義新的屬性。
  2. 覆蓋子類中的_get_area()_set_area()方法。 那么就沒有必要重新定義屬性——它們將被正常繼承,但會調用子類的內部方法。

這些都不復雜,但是當從具有屬性的 class 繼承時,您可能需要檢查一些額外的東西。

暫無
暫無

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

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