Python:如何在自身内部引用 class?
Python: How to refer a class inside itself?
正在尝试引用自身内部的 class。例如
class Test:
FOO_DICT = {1 : Test.bar} # NameError: name 'Test' is not defined
@staticmethod
def bar():
pass
这种用法有意义吗?还有更好的选择吗?
谢谢!
您可以像这样将 FOO_DICT = {1 : Test.bar}
移到 class 之外:
class Test:
@staticmethod
def bar():
pass
Test.FOO_DICT = {1: Test.bar}
如果你想让字典在class: 先定义函数然后去掉Test:
class Test:
@staticmethod
def bar():
pass
FOO_DICT = {1: bar}
使用 bar 而不是 Test.bar 会很好。
class Test:
@staticmethod
def bar():
pass
FOO_DICT = {1: bar}
# You can access this outside of the class by simply using Test.FOO_DICT
print(Test.FOO_DICT)
但是,有些情况下您确实需要使用 class 本身。 (请注意所问问题的场景。为此,只需使用 bar 而无需如上所述添加 Test )。
例如
class Test:
@staticmethod
def bar():
pass
def test_with_other_of_same_instance(self, other: Test):
print(other.FOO_DICT)
FOO_DICT = {1: bar}
在这种情况下,
- 我想定义一个接受同一测试对象的方法class。
- 我想使用 python 的类型提示来指示期望的参数是 Test 的一个实例。这让我获得了编辑器支持,如果我传递了错误数据类型的参数,pylance 和 mypy 等工具也可以通知我可能的错误。
在撰写本文时,我将收到 NameError:名称 'Test' 未定义。
这是因为默认情况下我无法在自身内部使用 class(python 的更高版本可能会更改其默认行为,因此我们将不需要解决方案到时候低于)。
但是如果你使用来自 3.7+ 的 Python 版本并且你不能在其内部引用 class,那么简单的解决方案是 PEP 563 - 推迟评估注释。它是通过在文件的第一行添加一小行代码来实现的
from __future__ import annotations
# other imports or code come afterwards
class Test:
@staticmethod
def bar():
pass
def test_with_other_of_same_instance(self, other: Test):
print(other.FOO_DICT)
FOO_DICT = {1: bar}
因此您可以在 python 中使用 class 本身,只需在文件开头包含该行即可。
通常情况下,如果您使用 pylance 或任何类似工具,您会收到警告或错误显示,表明您导入了一些东西但没有使用它。但不是在注释的情况下。您不必担心来自编辑器的任何警告。
请注意,这必须出现在文件的开头,否则会出现语法错误,并且 3.7 之前的版本将不支持此功能。
正在尝试引用自身内部的 class。例如
class Test:
FOO_DICT = {1 : Test.bar} # NameError: name 'Test' is not defined
@staticmethod
def bar():
pass
这种用法有意义吗?还有更好的选择吗? 谢谢!
您可以像这样将 FOO_DICT = {1 : Test.bar}
移到 class 之外:
class Test:
@staticmethod
def bar():
pass
Test.FOO_DICT = {1: Test.bar}
如果你想让字典在class: 先定义函数然后去掉Test:
class Test:
@staticmethod
def bar():
pass
FOO_DICT = {1: bar}
使用 bar 而不是 Test.bar 会很好。
class Test:
@staticmethod
def bar():
pass
FOO_DICT = {1: bar}
# You can access this outside of the class by simply using Test.FOO_DICT
print(Test.FOO_DICT)
但是,有些情况下您确实需要使用 class 本身。 (请注意所问问题的场景。为此,只需使用 bar 而无需如上所述添加 Test )。 例如
class Test:
@staticmethod
def bar():
pass
def test_with_other_of_same_instance(self, other: Test):
print(other.FOO_DICT)
FOO_DICT = {1: bar}
在这种情况下,
- 我想定义一个接受同一测试对象的方法class。
- 我想使用 python 的类型提示来指示期望的参数是 Test 的一个实例。这让我获得了编辑器支持,如果我传递了错误数据类型的参数,pylance 和 mypy 等工具也可以通知我可能的错误。
在撰写本文时,我将收到 NameError:名称 'Test' 未定义。
这是因为默认情况下我无法在自身内部使用 class(python 的更高版本可能会更改其默认行为,因此我们将不需要解决方案到时候低于)。
但是如果你使用来自 3.7+ 的 Python 版本并且你不能在其内部引用 class,那么简单的解决方案是 PEP 563 - 推迟评估注释。它是通过在文件的第一行添加一小行代码来实现的
from __future__ import annotations
# other imports or code come afterwards
class Test:
@staticmethod
def bar():
pass
def test_with_other_of_same_instance(self, other: Test):
print(other.FOO_DICT)
FOO_DICT = {1: bar}
因此您可以在 python 中使用 class 本身,只需在文件开头包含该行即可。
通常情况下,如果您使用 pylance 或任何类似工具,您会收到警告或错误显示,表明您导入了一些东西但没有使用它。但不是在注释的情况下。您不必担心来自编辑器的任何警告。
请注意,这必须出现在文件的开头,否则会出现语法错误,并且 3.7 之前的版本将不支持此功能。