Python 3.x Python:伪枚举-类作为枚举-如何避免循环导入
我想在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
# 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
,这将,此时,定义类