Python - 使用 classes 作为另一个 class' 属性的默认值 - NameError

Python - Using classes as default values of another class' attribute - NameError

我正在为我目前正在编写的 API 的包装器创建一个 classes 的结构。 我的模型文件中定义了多个 classes。我想将 classes 的某些属性的默认值分配给其他 classes。当我这样做时,我得到一个 NameError,因为有时我尝试使用定义在当前 class 之下的 classes,因此 Python 还不知道这些 classes .我尝试了多种解决方案,但其中 none 似乎有效。有人知道替代方案或对此有经验吗?

我的class我定义的是:

class RateResponse(BaseModel):

    def __init__(self, 
        provider=Provider()
    ):

        self.provider = provider


class Provider(ObjectListModel):

    def __init__(self):

        super(Provider, self).__init__(list=[], listObject=ProviderItem)

    @property
    def providerItems(self):
        return self.list

class ProviderItem(BaseModel):

    def __init__(self,
        code=None,
        notification=Notification(),
        service=Service()
    ):

        self.code = code
        self.notification = notification
        self.service = service

正如您在上面看到的,我正在使用 class 提供程序的一个空对象初始化 class RateResponse 上的属性 'provider',该对象在其下方定义。我在这一行收到 NameError,因为它定义在 RateResponse 下方。

provider=Provider()
NameError: name 'Provider' is not defined

上面的简单解决方案是移动 classes 的位置。然而,这只是我的文件的一个片段,目前有 400 行长,所有这些类型的 classes 和初始化。不可能全部正确排序。

我查找了一些解决方案,我认为我可以通过字符串 return 一个 class 的空对象。我认为该函数只会在定义了所有 classes 之后才计算,但我错了。这是我试过的:

def getInstanceByString(classStr):
    return globals()[classStr]()


class RateResponse(BaseModel):

    def __init__(self, 
        provider=getInstanceByString('Provider')
    ):

        self.provider = provider

但无济于事。有人有这方面的经验吗?这在 Python 内甚至可能吗?我的结构是错误的吗?任何帮助表示赞赏。谢谢。

此代码可能不是您想要的意思:

class RateResponse(BaseModel):

    def __init__(self, 
        provider=Provider()
    ):
        ...

这段代码表示,当声明此 class 时,您想要创建 Provider 的实例,这将是 provider 参数的默认值。

您的意思可能是对于每个创建 RateResponse.

实例的客户端,默认参数应该是 Provider 的新实例

您可以使用 Mutable Default Argument 模式来获得后者:

class RateResponse(BaseModel):

    def __init__(self, provider=None):
        if provider is None:
            provider = Provider()
        ...

但是,如果您确实想要单个实例,而客户端需要默认值,您可以在 下方 Provider定义:

class Provider(ObjectListModel):
    ...
Singleton_Provider = Provider()

那么 RateResponse class 仍然可以使用当前模式,而是在 if:

中执行此赋值
        if provider is None:
            provider = Singleton_Provider

在执行分配时,Singleton_Provider 将被创建。