【发布时间】:2021-11-20 12:35:30
【问题描述】:
如何实现在python中可继承的自定义构造函数(类方法)?
以下最小化的示例可能会提供一个想法:
from dataclasses import dataclass
from typing import Type, TypeVar
T = TypeVar("T")
@dataclass
class Parent:
something: int = 2
@classmethod
def from_float(cls: Type[T], something_as_float: float) -> T:
return Type[T](something=int(something_as_float))
@dataclass
class Child(Parent):
""" Should also be constructible via from_float
"""
assert isinstance(Parent.from_float(1.0), Parent)
assert isinstance(Child.from_float(1.0), Child)
mypy 不喜欢我从 from_float 返回时调用的构造函数。我不知道如何从类方法中引用类(Parent 或 Child)。
【问题讨论】:
-
你的意思是像一个实例工厂?
-
不确定...添加一个 C++ 模式以便我可以在 python 中实现一个 Rust 模式感觉就像我只是在给垃圾火添油:)
-
为什么不实现
__new__方法? -
@dataclass 隐式添加了获取字段的构造函数(以及 __new__?),我不能打扰它。我正在尝试将 rust 启发的转换方法添加到一些相互继承的现有数据类中,并且我无法更改设计的 dataclasses-with-inheritance 部分。
-
Type[T]不是构造函数;cls是。
标签: python inheritance type-hinting mypy python-typing