python - 抽象基类中的断言?

标签 python oop python-3.6 metaprogramming abc

本质上我想要的是要求抽象基类的子类不仅实现某些属性或方法,而且还可以对它们提出要求,例如数据类型或允许的值。

例如,假设我想要要求具有 namename 以字母“a”开头的类:

from abc import ABC, abstractproperty

class Base(ABC):
     @abstractproperty
     def name(self):
         assert self.name[0] == 'a' # or similar; help needed here

class Derived1(Base):
    name = 'albert' # I want this class definition to work

class Derived2(Base):
    name = 'john' # I want this class definition to fail the 'a' assertion

我将在基类中的何处/如何断言它?

最佳答案

使用 __init_subclass__ 对类属性实现限制。

class Base:
    def __init_subclass__(cls):
        try:
            name = cls.name
        except AttributeError:
            raise ValueError("No name attribute")

        if name[0] != "a":
            raise ValueError("first letter of name is not 'a'")


class Derived1(Base):
    name = 'albert' # OK

class Derived2(Base):
    name = 'john' # Fails due to first letter 'j'

# Fails because Derived3.name is never defined
class Derived3(Base):
    pass  

关于python - 抽象基类中的断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56691853/

相关文章:

c# - 如何针对一组可变的值范围进行验证?

python - 为什么在 Python 3.6 中计算 f"\{10}"时符号 '{' 仍然存在?

numpy - 如何使用 lambda 函数将 numpy 数组发送到 sagemaker 端点

python将PST时间转换为UTC isoformat

python - sklearn OPTICS 和预先计算的余弦矩阵不产生簇

python - Cython Cimport 无法解析的外部符号

javascript - 在 javascript 中查看对象(底层)

python - 单击 python 我如何从命令行读取 json 之类的参数

c# - 在 Unity 中访问全局游戏数据 (C#)

python - 无法成功导入tensorflowjs