使方法 return 成为子类的对象
Make a method return an object of a subclass
我想为 class 提供方法,以便将其转换为特殊情况,由子class 表示。我不确定,但是最好的方法是什么。
这是一个说明性的例子:
class Vector(pd.Series):
def normalize(self) -> "NormalizedVector":
result: "NormalizedVector" = self / sum(self) # type:ignore
return result
class NormalizedVector(Vector):
pass
但是此实现存在问题:
isinstance(vector.normalize(), NormalizedVector)
将是 False
- (相关地)静态类型检查需要
# type: ignore
注释
所以我的问题是:实现此目的的简洁方法是什么?
我发现的替代方法是使用动态分配:
class Vector(pd.Series):
pass
class NormalizedVector(Vector):
pass
def normalize_vector(self: Vector) -> NormalizedVector:
return NormalizedVector(self / sum(self))
Vector.normalize = normalize_vector
但是:
- 我发现它使代码的可读性大大降低
- 我怕弄乱了结束方法的元数据,比如
__name__
单独的类型提示不会导致值成为被提示的类型。您需要创建 一个实例。您的第二种方法有效,因为您实际上创建了该实例。显式赋值是不必要的。
class Vector(pd.Series):
def normalize(self) -> "NormalizedVector":
return NormalizedVector(self / sum(self))
class NormalizedVector(Vector):
pass
我想为 class 提供方法,以便将其转换为特殊情况,由子class 表示。我不确定,但是最好的方法是什么。
这是一个说明性的例子:
class Vector(pd.Series):
def normalize(self) -> "NormalizedVector":
result: "NormalizedVector" = self / sum(self) # type:ignore
return result
class NormalizedVector(Vector):
pass
但是此实现存在问题:
isinstance(vector.normalize(), NormalizedVector)
将是False
- (相关地)静态类型检查需要
# type: ignore
注释
所以我的问题是:实现此目的的简洁方法是什么?
我发现的替代方法是使用动态分配:
class Vector(pd.Series):
pass
class NormalizedVector(Vector):
pass
def normalize_vector(self: Vector) -> NormalizedVector:
return NormalizedVector(self / sum(self))
Vector.normalize = normalize_vector
但是:
- 我发现它使代码的可读性大大降低
- 我怕弄乱了结束方法的元数据,比如
__name__
单独的类型提示不会导致值成为被提示的类型。您需要创建 一个实例。您的第二种方法有效,因为您实际上创建了该实例。显式赋值是不必要的。
class Vector(pd.Series):
def normalize(self) -> "NormalizedVector":
return NormalizedVector(self / sum(self))
class NormalizedVector(Vector):
pass