Python: проверка типа абстрактного свойства - PullRequest
0 голосов
/ 13 февраля 2020

Мне интересно, как лучше всего обрабатывать проверку абстрактных типов свойств?

from abc import ABC, abstractmethod

class Base(ABC):

    @property
    @abstractmethod
    def name(self):
       """
       :type str
       """
       pass

class MyClass(Base):
    name = 1    # TypeError

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Используйте __init_subclass__. Вы не можете name быть собственностью вообще, абстрактным или иным образом.

class Base:

    def __init_subclass__(cls, *args, **kwargs):
       super().__init_subclass__(**kwargs)
       if not isinstance(cls.name, str):
           raise TypeError(f'{cls.name} is not a string value')


class MyClass(Base):
    name = 1
0 голосов
/ 13 февраля 2020

Не так просто, но это можно сделать так:

from abc import ABC, abstractmethod

class Base(ABC):

    @property
    @abstractmethod
    def name(self):
        raise NotImplementedError("To be provided in derived classes")

class AClass(Base):
    def __init__(self):
        self._name = ""

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        if type(value) is not str:
            raise ValueError("Only string is allowed")
        self._name = value

a = AClass()
a.name = "hello" # no error
a.name = 1       # raises a value error

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...