Python декоратор дочернего класса. Почему я могу квалифицировать декораторы с родительским классом только один раз - PullRequest
1 голос
/ 05 августа 2020

Я пробовал этот код в python 3.6

from abc import ABC, abstractmethod

class A(ABC):

  @property
  @abstractmethod
  def prop1(self):
    pass
    
  @prop1.setter
  @abstractmethod
  def prop1(self, val):
    pass

class B(A):
  def __init__(self, val=None):
    self._prop = val

  @A.prop1.setter
  def prop1(self, val):
    if val == "something":
      self._prop = val
    else:
      self._prop = "nothing"

  @A.prop1.getter
  def prop1(self):
    return self._prop

  def do_something(self):
    self.prop1 = "blah"

Получаю ошибку TypeError: Can't instantiate abstract class B with abstract methods prop1. Но если я удалю @A из переопределенного геттера таким образом, код будет работать нормально.

@prop1.getter
 def prop1(self):
   return self._prop

Более того, не имеет значения, находится ли геттер выше или ниже сеттера. Только самому первому, кажется, нужен @A.. Почему так?

1 Ответ

0 голосов
/ 05 августа 2020

Вам вообще не нужно ссылаться на свойства базовых классов при их переопределении в подклассе

from abc import ABC, abstractmethod


class A(ABC):

    @property
    @abstractmethod
    def prop1(self):
        pass

    @prop1.setter
    @abstractmethod
    def prop1(self, val):
        pass


class B(A):
    def __init__(self, val=None):
        self._prop = val

    @property
    def prop1(self):
        return self._prop

    @prop1.setter
    def prop1(self, val):
        if val == "something":
            self._prop = val
        else:
            self._prop = "nothing"

    def do_something(self):
        self.prop1 = "blah"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...