亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用類作為其方法中參數的類型提示

使用類作為其方法中參數的類型提示

瀟瀟雨雨 2019-11-04 11:01:30
我下面包含的代碼引發以下錯誤:NameError: name 'Vector2' is not defined 在這一行:def Translate (self, pos: Vector2):為什么Python無法Vector2在Translate方法中識別我的類?class Vector2:    def __init__(self, x: float, y: float):        self.x = x        self.y = y    def Translate(self, pos: Vector2):        self.x += pos.x        self.y += pos.y
查看完整描述

2 回答

?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

因為當它遇到時Translate(在編譯類主體時),Vector2尚未被定義(當前正在編譯中,尚未執行名稱綁定);Python自然會抱怨。


由于這是一種常見的情況(在該類的主體中鍵入一個類的類型),因此應使用對它的前向引用,將其括在引號中:


class Vector2:    

    # __init__ as defined


    def Translate(self, pos: 'Vector2'):    

        self.x += pos.x

        self.y += pos.y

Python(以及所有符合的檢查程序PEP 484)將理解您的提示并進行適當的注冊。__annotations__通過typing.get_type_hints以下方式訪問時,Python確實會識別出這一點:


from typing import get_type_hints


get_type_hints(Vector2(1,2).Translate)

{'pos': __main__.Vector2}


查看完整回答
反對 回復 2019-11-04
?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

您要求的功能稱為正向(類型)引用,并且從3.7(在PEP 563中)起已添加到Python中。1因此,這現在有效:


from __future__ import annotations

class C:

    def spam(self, other: C) -> C:

        pass

注意__future__聲明。直到4.0才需要。


不幸的是,在Python 3.6及更早版本中,此功能不可用,因此您必須使用字符串注釋,如Jim Fasarakis Hilliard的答案所述。


Mypy已經支持前向聲明,即使在Python 3.6下運行時也是如此。但是,如果靜態類型檢查器說您的代碼很好,但是NameError當您嘗試實際運行它時,解釋器會引發一個正向聲明,這對您沒有多大幫助。


1.這已在PEP 484中討論為可能的功能,但在人們對在批注中使用前向聲明有更多經驗之后,將其推遲到以后。PEP 563 / Python 3.7就是“后來的”。


查看完整回答
反對 回復 2019-11-04
  • 2 回答
  • 0 關注
  • 542 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號