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 之前的版本将不支持此功能