Python中没有抽象方法的抽象数据类:禁止实例化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中没有抽象方法的抽象数据类:禁止实例化相关的知识,希望对你有一定的参考价值。

即使类从ABC继承,看起来它仍然可以实例化,除非它包含抽象方法。

具有下面的代码,防止创建Identifier对象的最佳方法是什么:Identifier(['get', 'Name'])

from abc import ABC
from typing import List
from dataclasses import dataclass

@dataclass
class Identifier(ABC):
    sub_tokens: List[str]

    @staticmethod
    def from_sub_tokens(sub_tokens):
        return SimpleIdentifier(sub_tokens) if len(sub_tokens) == 1 else CompoundIdentifier(sub_tokens)


@dataclass
class SimpleIdentifier(Identifier):
    pass


@dataclass
class CompoundIdentifier(Identifier):
    pass

如果已经回答了这个问题,我事先表示歉意。似乎很基本,但是由于某种原因我找不到答案。

欢呼声,Hlib。

答案

我发现的最简单的方法是在__post_init__方法中检查对象的类型:

@dataclass
class Identifier(ABC):
    ...

    def __post_init__(self):
        if self.__class__ == Identifier:
            raise TypeError("Cannot instantiate abstract class.")

    ...

以上是关于Python中没有抽象方法的抽象数据类:禁止实例化的主要内容,如果未能解决你的问题,请参考以下文章

抽象类和抽象方法

继承一个抽象类,并实例化抽象类中定义的方法,这个方法返回spring注入的一个对象,值一直为空?

PHP能在类中实例化一个类吗

抽象类不能实例化对象

抽象类VS接口

Java中抽象类也能实例化.RP