小编mal*_*sen的帖子

Python 方法重写 - 派生类中的参数比基类中的参数更具体

假设我想创建一个名为 的抽象基类Document。我希望类型检查器保证其所有子类都实现一个名为 的类方法from_paragraphs,该方法从一系列Paragraph对象构造一个文档。然而, aLegalDocument只能从LegalParagraph对象构造,而AcademicDocument- 只能从AcademicParagraph对象构造。

我的直觉是这样做:

from abc import ABC, abstractmethod
from typing import Sequence


class Document(ABC):
    @classmethod
    @abstractmethod
    def from_paragraphs(cls, paragraphs: Sequence["Paragraph"]):
        pass


class LegalDocument(Document):
    @classmethod
    def from_paragraphs(cls, paragraphs: Sequence["LegalParagraph"]):
        return  # some logic here...


class AcademicDocument(Document):
    @classmethod
    def from_paragraphs(cls, paragraphs: Sequence["AcademicParagraph"]):
        return  # some logic here...


class Paragraph:
    text: str


class LegalParagraph(Paragraph):
    pass


class AcademicParagraph(Paragraph):
    pass
Run Code Online (Sandbox Code Playgroud)

然而,Pyright 对此有所抱怨,因为from_paragraphs在派生类上违反了里氏替换原则。如何确保每个派生类都实现某种from_paragraphs类型?Paragraph

python methods inheritance overriding python-3.x

5
推荐指数
1
解决办法
81
查看次数

标签 统计

inheritance ×1

methods ×1

overriding ×1

python ×1

python-3.x ×1