【发布时间】:2021-04-22 00:43:48
【问题描述】:
我正在使用严格类型的 Python,并希望实现类似于 C++ 的复制/移动构造函数重载的功能。也就是说,我想使用显式定义使我的对象可转换为另一种类型。
这是一个例子:
class CallerSurface(StringEnum):
IOS_APPLICATION = "ios_application"
ANDROID_APPLICATION = "android_application"
WEB_APPLICATION = "web_application"
我可以使用一些功能,例如:
def getResponse(data: Data, caller_name: CallerSurface) -> str:
我想添加 CallerSurface 类定义的一部分,以使一个函数可以接受 CallerSurface 类型的参数,也可以接受 str 类型的参数,并且只是“知道”如何转换str 到 CallerSurface,程序员无需显式计算转换。
所以我想按如下方式使用:
caller_name: str = HTTPUtils.extractCallerFromUserAgent(request)
response = getResponse(other_data, caller_name)
caller_name 是一个 str,但 getResponse 采用 CallerSurface。我想在 CallerSurface 类中隐式定义转换。
在 C++ 中,您可以通过定义一个复制和一个接收字符串的移动构造函数来实现这一点。 Python中有什么东西吗?
【问题讨论】:
-
严格类型的 Python 是什么意思? Python 使用鸭子类型,并且不会在您的代码示例中强制使用可选的类型注释。
-
你应该已经能够做到(例如)
CallerSurface("ios_application")。您还可以使用另一个CallerSurface实例调用CallerSurface构造函数,这为您提供了一种相当简单地将Union[CallerSurface, str]转换为CallerSurface的方法。
标签: python casting copy-constructor move-constructor