我面臨以下問題。假設我想為Dataset及其Samples 定義泛型類。然后,我想創建這些最終將被實體化的特定子類(例如DatasetOfSpecificSamples,包含MoreSpecificSample樣本)。為了節省一些 LoC,我想在Dataset課堂上實作通用功能。
然而,我無法正確地獲得繼承的子類中的型別提示。他們太籠統了。請參閱以下示例,我希望__iter__回傳型別 ofDatasetOfSpecificSamples將是MoreSpecificSample,但 MyPy 推斷只是Sample。
有沒有辦法在不重新定義方法本身的情況下強制執行更具體的提示?
from typing import Mapping, Iterator
class Sample:
pass
class MoreSpecificSample(Sample):
pass
class Dataset:
def __init__(self, samples: Mapping[str, Sample]):
self.samples = samples
def __iter__(self) -> Iterator[Sample]:
yield from self.samples.values()
class DatasetOfSpecificSamples(Dataset):
samples: Mapping[str, MoreSpecificSample]
# def __iter__(self) -> Iterator[CommonCriteriaCert]: <-- This fixes the problem, as it specifies the type
# yield from self.certs.values()
dset = DatasetOfSpecificSamples()
for sample in dset: # <-- the inferred type of "sample" is Sample, not MoreSpecificSample
pass
uj5u.com熱心網友回復:
使Dataset類通用:
T = TypeVar("T")
class Dataset(Generic[T]):
def __init__(self, samples: Mapping[str, T]):
self.samples = samples
def __iter__(self) -> Iterator[T]:
yield from self.samples.values()
class DatasetOfSpecificSamples(Dataset[MoreSpecificSample]):
samples: Mapping[str, MoreSpecificSample]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/428620.html
