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
将被创建。
我正在为我目前正在编写的 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
将被创建。