【发布时间】:2022-01-05 04:50:42
【问题描述】:
假设我有这样的课程:
class myclass:
def __init__ (self, param1: Tuple[str,...], param2: bool) -> None:
self.member1 = param1
self.member2 = param2
self.member3 = 10
def gimmie(self) -> int | Tuple[str,...]:
return self.member1 if self.member2 else self.member3
有什么方法可以确保来自 gimmie 的返回不是类型为int | Tuple[str,...],而是int或Tuple[str,...]? p>
编辑:
有几个答案需要大量的杂技才能做到这一点,而我真正想做的只是cast 回报。因此,这些答案中的每一个都对代码“气味”进行了评论。
问题只是我构造了一个带有标志的对象,其中一种方法根据该标志返回 2 种类型中的 1 种。如果那是糟糕的设计,那么“正确”的做法是什么?
【问题讨论】:
-
你可以使用泛型并将构造函数包装在工厂函数中吗?
-
@Samwise 不知道,请详细说明。
-
我认为您需要将返回类型绑定到类类型。因此,一种方法是让该类成为泛型,例如
myclass[int]与myclass[Tuple[str,...]]。另一种方式(也许我会走的方式)是拥有具有不同方法签名的子类。 -
@Samwise 我不熟悉泛型,我需要研究一下。对于后者,您将如何推迟返回子类?
-
与您对
@overload所做的类似,为父类指定联合类型,并在子类中实现缩小范围。
标签: python python-3.x overloading type-hinting