Python 3.x Python:伪枚举-类作为枚举-如何避免循环导入

Python 3.x Python:伪枚举-类作为枚举-如何避免循环导入,python-3.x,enums,python-import,Python 3.x,Enums,Python Import,我想在python项目中创建一个伪枚举。 这些值实际上是类 # file my_enums.py import MyClass1 import MyClass2 import MyClass3 class MyEnum: MY_CLASS_1 = MyClass1 MY_CLASS_2 = MyClass2 MY_CLASS_3 = MyClass3 # file my_class1.py import MyEnum class MyClass1: d

我想在python项目中创建一个伪枚举。 这些值实际上是类

# file my_enums.py

import MyClass1
import MyClass2
import MyClass3

class MyEnum:
    MY_CLASS_1 = MyClass1
    MY_CLASS_2 = MyClass2
    MY_CLASS_3 = MyClass3



# file my_class1.py
import MyEnum

class MyClass1:
    def foo(self, x):
        print(isinstance(x, MyEnum.MY_CLASS_2))
这样做将导致循环导入错误。 我希望能够在isinstance函数中使用MyEnum值,并将枚举导入到定义其中一些类的模块中。 有没有办法做到这一点

解决方案:

# file my_enums.py

import MyClass1
import MyClass2
import MyClass3

class MyEnum:

    MY_CLASS_1 = None
    MY_CLASS_2 = None
    MY_CLASS_3 = None
    
    @classmethod
    def define(cls):
        cls.MY_CLASS_1 = MyClass1

MyEnum.define()

需要记住的是,当加载模块时,它会被执行——但只执行顶级语句和顶级类的直接内部;函数体和方法体在实际调用之前不会进行评估

# example module

CONSTANT = 7                    # top-level, executed

def a_func(value=CONSTANT):     # top-level, executed
    return value + 9            # body, not executed

class a_class(metaclass=SomeMeta):  # top-level, executed (and error as SomeMeta
                                    # has not been defined nor imported)
    CLS_CONSTANT = 3                # top-level class body, executed

    def a_method(self):             # executed
        return self.CLS_CONSTANT + FUTURE_CONSTANT  # method body, not executed

FUTURE_CONSTANT = 11
因此,在您的示例中,您需要确保并且不要在导入过程中执行的
my_class1.py
中的任何位置使用
MyEnum
,并将导入的
my_enums.py
放在最后——然后在导入过程中执行
my_class1
时,它将能够导入
my_class1
,这将,此时,定义类