亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么從zope.interface了解Python接口

發布時間:2021-11-19 14:31:32 來源:億速云 閱讀:148 作者:iii 欄目:編程語言

這篇文章主要講解了“怎么從zope.interface了解Python接口”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么從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。邊界框應該是一個屬性,而不是一個方法。

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

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

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

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

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

from zope import interface class ISprite(interface.Interface):     bounding_box = interface.Attribute(        "邊界框"    )     def intersects(box):        "它和一個框相交嗎?"

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

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

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

@implementer(ISprite)@attr.s(auto_attribs=True)class CircleSprite:    x: float    y: float    radius: float     @property    def bounding_box(self):        return (            self.x - self.radius,            self.y - self.radius,            self.x + self.radius,            self.y + self.radius,        )     def intersects(self, box):        # 當且僅當至少一個角在圓內時,方框與圓相交        top_left, bottom_right = box[:2], box[2:]        for choose_x_from (top_left, bottom_right):            for choose_y_from (top_left, bottom_right):                x = choose_x_from[0]                y = choose_y_from[1]                if (((x - self.x) ` 2 + (y - self.y) ` 2) <=                    self.radius ` 2):                     return True        return False

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

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

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

感謝各位的閱讀,以上就是“怎么從zope.interface了解Python接口”的內容了,經過本文的學習后,相信大家對怎么從zope.interface了解Python接口這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石柱| 安丘市| 定结县| 开化县| 桃江县| 荔浦县| 昭觉县| 惠水县| 高州市| 北票市| 察哈| 张家界市| 保靖县| 阿拉尔市| 鄄城县| 桦南县| 会东县| 肃南| 余江县| 无极县| 白河县| 海淀区| 象山县| 项城市| 惠东县| 乐安县| 枣庄市| 三门县| 牙克石市| 和平区| 门源| 山西省| 尖扎县| 开江县| 古田县| 常州市| 策勒县| 章丘市| 谢通门县| 紫金县| 三门县|