为什么说找不到我的类?为什么我应该创建另一个同名的类才能让它不抱怨?
from typing import Dict
class WeekDay:
def __init__(self, day_number, day_name):
self.day_name = day_name
self.day_number = day_number
@staticmethod
def get_week_days() -> Dict[str, WeekDay]: # WeekDay unresolved reference error
weekdays = {
"monday": WeekDay(1, "Monday"),
"tuesday": WeekDay(2, "Tuesday"),
"wednesday": WeekDay(3, "Wednesday"),
"thursday": WeekDay(4, "Thursday"),
"friday": WeekDay(5, "Friday"),
"saturday": WeekDay(6, "Saturday"),
"sunday": WeekDay(7, "Sunday")
}
return weekdays
来自文档(部分转发参考)
当类型提示包含尚未定义的名称时,该定义可以表示为字符串文本,以便稍后解析。
通常发生这种情况的情况是 容器类,其中定义的类出现在签名中 的一些方法。
因此,为了解决这个问题,只需用引号包装类型,如下所示:
from typing import Dict
class WeekDay:
def __init__(self, day_number, day_name):
self.day_name = day_name
self.day_number = day_number
@staticmethod
def get_week_days() -> Dict[str, 'WeekDay']: # quote WeekDay
weekdays = {
"monday": WeekDay(1, "Monday"),
"tuesday": WeekDay(2, "Tuesday"),
"wednesday": WeekDay(3, "Wednesday"),
"thursday": WeekDay(4, "Thursday"),
"friday": WeekDay(5, "Friday"),
"saturday": WeekDay(6, "Saturday"),
"sunday": WeekDay(7, "Sunday")
}
return weekdays
从 Python3.7 开始,您可以使用:from __future__ import annotations
您不能从类自己的定义中引用该类
class A:
def foo(self):
pass
bar = A.foo
这将引发以下错误:
Traceback (most recent call last):
class A:
File "/home/shmulik/so/ans.py", line 28, in A
bar = A.foo
NameError: name 'A' is not defined
作为解决此问题的解决方法,PEP484 - 类型提示(感谢@ashwini-chaudhary的评论)允许将类定义编写为字符串。
当类型提示包含尚未定义的名称时,该 定义可以表示为字符串文本,稍后要解决。
因此,我们可以例如编写:
class A:
def foo(self, x: 'A'):
pass
并且这个类将被 Python 愉快地解释。
旁注
所以嘿,你在第一个示例中提到我们不能从它的定义中引用类,那么为什么这段代码有效呢?
class A:
def foo(self):
A.bar()
@staticmethod
def bar():
print(42)
A().foo()
这段代码的工作原理是 Python 解释器在类A
的定义过程中跳过foo()
的方法定义的主体,只有在最后一行,当调用foo()
时(并且定义了类 A),Python 解释器才会执行foo()
的主体并调用A.bar()
。