python中类的前向声明设计不好吗?[duplicate]

jv2fixgn  于 2022-12-14  发布在  Python
关注(0)|答案(2)|浏览(109)

此问题在此处已有答案

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++中吗?
s5a0g9ez

s5a0g9ez1#

你的问题更像是一个XY问题,至少在这个例子中是这样。
如果使用from __future__ import annotations,则不会出现错误。
另一种解决方法是使用字符串提示:book_library: "Library"
如上所述,book_list: Book[]无效,请改用book_list: list[Book]

ncgqoxb0

ncgqoxb02#

在Python中进行此类键入的正确方法是使用__future__模块:

from __future__ import annotations
from dataclasses import dataclass

@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]

(Also固定Book[]类型)

相关问题