此问题在此处已有答案:
How do I type hint a method with the type of the enclosing class?(7个答案)
Self-reference or forward-reference of type annotations in Python [duplicate](1个答案)
昨天关门了。
我遇到过类似于示例1的引用问题;
@dataclass
class Book:
book_id:int
book_name:str
book_library: Library #The object where book is stored
@dataclass
class Library:
library_id:int
library_capasity: int
book_list: list[Book]
在上面显示的示例中,我遇到了未定义的Library对象,因为它是在Book类声明之后定义的。
为了克服这个问题,我添加了类似于示例2的代码块;
@dataclass
class Library:
pass
class Book:
book_id:int
book_name:str
book_library: Library #The object where book is stored
@dataclass
class Library:
library_id:int
library_capasity: int
book_list: list[Book]
此后未发生错误。
我的问题如下:
- 我用来克服这个问题的方法是前向声明。这是一个糟糕的代码设计吗?
- Python是一种解释性语言,并且正在被解释的语言会导致示例1中出现的错误?
- 例1中的相同错误可能发生在基于编译器的编程语言Java或C++中吗?
2条答案
按热度按时间s5a0g9ez1#
你的问题更像是一个XY问题,至少在这个例子中是这样。
如果使用
from __future__ import annotations
,则不会出现错误。另一种解决方法是使用字符串提示:
book_library: "Library"
如上所述,
book_list: Book[]
无效,请改用book_list: list[Book]
。ncgqoxb02#
在Python中进行此类键入的正确方法是使用
__future__
模块:(Also固定
Book[]
类型)