gpt4 book ai didi

python - Python : prohibit instantiation 中没有抽象方法的抽象数据类

转载 作者:行者123 更新时间:2023-12-03 19:42:50 25 4
gpt4 key购买 nike

即使一个类是从 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

如果这个问题已经得到回答,我提前道歉。这看起来很基本,但是,由于某种原因我找不到答案。

干杯,赫利卜。

最佳答案

您可以创建一个 AbstractDataclass保证这种行为的类,并且每次遇到您描述的情况时都可以使用它。

@dataclass 
class AbstractDataclass(ABC):
def __new__(cls, *args, **kwargs):
if cls == AbstractDataclass or cls.__bases__[0] == AbstractDataclass:
raise TypeError("Cannot instantiate abstract class.")
return super().__new__(cls)

所以,如果 Identifier继承自 AbstractDataclass而不是来自 ABC直接修改 __post_init__将不需要。
@dataclass
class Identifier(AbstractDataclass):
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

实例化 Identifier会养 TypeError但没有实例化 SimpleIdentifierCompountIdentifier .
AbstractDataclass可以在代码的其他部分重用。

关于python - Python : prohibit instantiation 中没有抽象方法的抽象数据类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60590442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com