Утверждение в абстрактном базовом классе? - PullRequest
1 голос
/ 20 июня 2019

По сути, я хочу, чтобы подклассы абстрактных базовых классов не только реализовывали определенные атрибуты или методы, но также могли предъявлять требования к ним, такие как типы данных или допустимые значения.

Например, допустим, я хочу, чтобы классы имели name и что name начинается с буквы '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

Где / как бы я утверждал это в базовом классе?

1 Ответ

4 голосов
/ 20 июня 2019

Используйте __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  
...