成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

借助zope.interface深入了解Python接口

開發 后端
Zope.interface 可以幫助聲明存在哪些接口,是由哪些對象提供的,以及如何查詢這些信息。

[[311934]]

Zope.interface 可以幫助聲明存在哪些接口,是由哪些對象提供的,以及如何查詢這些信息。

zope.interface 庫可以克服 Python 接口設計中的歧義性。讓我們來研究一下。

隱式接口不是 Python 之禪

Python 之禪 很寬松,但是有點自相矛盾,以至于你可以用它來例證任何東西。讓我們來思考其中最著名的原則之一:“顯示勝于隱式”。

傳統上,在 Python 中會隱含的一件事是預期的接口。比如函數已經記錄了它期望一個“類文件對象”或“序列”。但是什么是類文件對象呢?它支持 .writelines嗎?.seek 呢?什么是一個“序列”?是否支持步進切片,例如 a[1:10:2]?

最初,Python 的答案是所謂的“鴨子類型”,取自短語“如果它像鴨子一樣行走,像鴨子一樣嘎嘎叫,那么它可能就是鴨子”。換句話說,“試試看”,這可能是你能得到的最具隱式的表達。

為了使這些內容顯式地表達出來,你需要一種方法來表達期望的接口。Zope Web 框架是最早用 Python 編寫的大型系統之一,它迫切需要這些東西來使代碼明確呈現出來,例如,期望從“類似用戶的對象”獲得什么。

zope.interface 由 Zope 開發,但作為單獨的 Python 包發布。Zope.interface 可以幫助聲明存在哪些接口,是由哪些對象提供的,以及如何查詢這些信息。

想象編寫一個簡單的 2D 游戲,它需要各種東西來支持精靈界面(LCTT 譯注:“精靈 Sprite”是指游戲面板中各個組件)。例如,表示一個邊界框,但也要表示對象何時與一個框相交。與一些其他語言不同,在 Python 中,將屬性訪問作為公共接口一部分是一種常見的做法,而不是實現 getter 和 setter。邊界框應該是一個屬性,而不是一個方法。

呈現精靈列表的方法可能類似于:

  1. def render_sprites(render_surface, sprites):
  2.     """
  3.     sprites 應該是符合 Sprite 接口的對象列表:
  4.     * 一個名為 "bounding_box" 的屬性,包含了邊界框
  5.     * 一個名為 "intersects" 的方法,它接受一個邊界框并返回 True 或 False
  6.     """
  7.     pass # 一些做實際渲染的代碼

該游戲將具有許多處理精靈的函數。在每個函數中,你都必須在隨附文檔中指定預期。

此外,某些函數可能期望使用更復雜的精靈對象,例如具有 Z 序的對象。我們必須跟蹤哪些方法需要 Sprite 對象,哪些方法需要 SpriteWithZ 對象。

如果能夠使精靈是顯式而直觀的,這樣方法就可以聲明“我需要一個精靈”,并有個嚴格定義的接口,這不是很好嗎?來看看 zope.interface。

  1. from zope import interface
  2.  
  3. class ISprite(interface.Interface):
  4.  
  5.     bounding_box = interface.Attribute(
  6.         "邊界框"
  7.     )
  8.  
  9.     def intersects(box):
  10.         "它和一個框相交嗎?"

乍看起來,這段代碼有點奇怪。這些方法不包括 self,而包含 self 是一種常見的做法,并且它有一個屬性。這是在 zope.interface 中聲明接口的方法。這看起來很奇怪,因為大多數人不習慣嚴格聲明接口。

這樣做的原因是接口顯示了如何調用方法,而不是如何定義方法。因為接口不是超類,所以它們可以用來聲明數據屬性。

下面是一個能帶有圓形精靈的接口的一個實現:

  1. @implementer(ISprite)
  2. @attr.s(auto_attribs=True)
  3. class CircleSprite:
  4.     x: float
  5.     y: float
  6.     radius: float
  7.  
  8.     @property
  9.     def bounding_box(self):
  10.         return (
  11.             self.x - self.radius,
  12.             self.y - self.radius,
  13.             self.x + self.radius,
  14.             self.y + self.radius,
  15.         )
  16.  
  17.     def intersects(self, box):
  18.         # 當且僅當至少一個角在圓內時,方框與圓相交
  19.         top_left, bottom_right = box[:2], box[2:]
  20.         for choose_x_from (top_left, bottom_right):
  21.             for choose_y_from (top_left, bottom_right):
  22.                 x = choose_x_from[0]
  23.                 y = choose_y_from[1]
  24.                 if (((x - self.x) ` 2 + (y - self.y) ` 2) <=
  25.                     self.radius ` 2):
  26.                      return True
  27.         return False

顯式聲明了實現了該接口的 CircleSprite 類。它甚至能讓我們驗證該類是否正確實現了接口:

  1. from zope.interface import verify
  2.  
  3. def test_implementation():
  4.     sprite = CircleSprite(x=0, y=0, radius=1)
  5.     verify.verifyObject(ISprite, sprite)

這可以由 pytest、nose 或其他測試框架運行,它將驗證創建的精靈是否符合接口。測試通常是局部的:它不會測試僅在文檔中提及的內容,甚至不會測試方法是否可以在沒有異常的情況下被調用!但是,它會檢查是否存在正確的方法和屬性。這是對單元測試套件一個很好的補充,至少可以防止簡單的拼寫錯誤通過測試。 

 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2010-06-23 20:31:54

2010-07-13 09:36:25

2010-11-19 16:22:14

Oracle事務

2020-09-21 09:53:04

FlexCSS開發

2009-08-25 16:27:10

Mscomm控件

2022-08-26 13:48:40

EPUBLinux

2020-07-20 06:35:55

BashLinux

2011-07-18 15:08:34

2022-06-03 10:09:32

威脅檢測軟件

2010-11-15 11:40:44

Oracle表空間

2018-06-22 13:05:02

前端JavaScript引擎

2021-01-19 12:00:39

前端監控代碼

2010-09-27 09:31:42

JVM內存結構

2010-11-08 13:54:49

Sqlserver運行

2013-04-16 10:20:21

云存儲服務云存儲SLA服務水平協議

2021-04-28 10:13:58

zookeeperZNode核心原理

2023-11-14 09:18:00

Python代碼

2023-11-02 07:55:31

Python對象編程

2019-08-02 08:59:21

Token認證服務器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲视屏| 成人免费一区二区三区牛牛 | 麻豆亚洲| 色免费在线视频 | 热re99久久精品国99热观看 | 免费黄色片在线观看 | 日韩成人免费视频 | 久久久久久久国产精品 | 成人福利视频 | 99久久久久国产精品免费 | 欧美极品一区二区 | 中文字幕一区二区三 | 毛片链接 | 精品国产一区二区在线 | 欧美 日韩 国产 一区 | 97精品一区二区 | 精品免费观看 | 久久精品网| 久久综合激情 | 国产精品欧美精品日韩精品 | 国产精品久久久久久高潮 | 一区二区三区精品在线 | 99久久久久久99国产精品免 | 97在线观看 | 中文字幕日韩一区 | 日韩at| 91玖玖| 久久99深爱久久99精品 | aaaa日韩| 国外成人在线视频网站 | 国产日韩欧美一区二区 | 九九精品在线 | 日本免费一区二区三区 | 国产欧美精品一区二区 | 国产日韩欧美 | 亚洲三级在线观看 | 青春草在线 | 国产成人在线一区二区 | 免费一区二区 | 在线欧美激情 | 久久激情网 |