python не может использовать базовое абстрактное свойство calass из подкласса gettig. AttributeError: у объекта 'super' нет атрибута - PullRequest
0 голосов
/ 23 апреля 2020

Я не понимаю, здесь что-то, что является базовым c Как я могу использовать свойство из базы, которая также является абстрактным классом из его подкласса, здесь небольшой код:

from abc import abstractmethod, ABC
class Base(ABC):

    @property
    def is_ver0(self):
        return None

    @abstractmethod
    def execute_sql(self):
        print("Base execute_sql")

    def print_and_exit(self):
        print("Base")

А вот подкласс который реализует execute_ sql, а также хочет установить и получить значение базы is_ver0 Хотя я могу без проблем вызывать super (). print_and_exit, я могу вызывать super (). is_ver0 почему?

from base import Base
class Sub(Base):
   def __init__(self):
        self.execute_sql()
    def execute_sql(self):
        print("Sub execute_sql")
        super().print_and_exit
        super().is_ver0 = 1
        q = super().is_ver0
        print(q)


if __name__ == '__main__':
    s = Sub()
    s.execute_sql()

но я получаю эту ошибку:

raceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.3.2\plugins\python-ce\helpers\pydev\pydevd.py", line 1434, in _exec
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.3.2\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/Dev/python/new_tester/sub.py", line 22, in <module>
    s = Sub()
  File "C:/Dev/python/new_tester/sub.py", line 10, in __init__
    self.execute_sql()
  File "C:/Dev/python/new_tester/sub.py", line 16, in execute_sql
    super().is_ver0 = 1
AttributeError: 'super' object has no attribute 'is_ver0'

ОБНОВЛЕНИЕ все еще ошибка, я добавил сеттер в базовый класс, и все же я получил ошибку, что c что мне здесь не хватает?

class Base(ABC):
    __xx = None
    @property
    def is_ver0(self):
        return self.__xx

    @__xx.setter
    def set_x(self,xxx):
        self.__xx = xxx

    @abstractmethod
    def execute_sql(self):
        print("Base execute_sql")

    def print_and_exit(self):
        print("Base")


Traceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\Dev\python\new_tester\base.py", line 2, in <module>
    class Base(ABC):
  File "C:\Dev\python\new_tester\base.py", line 8, in Base
    @__xx.setter
AttributeError: 'NoneType' object has no attribute 'setter'

1 Ответ

1 голос
/ 24 апреля 2020

Вы можете просто установить атрибут через self.is_ver0 = 1. Однако на данный момент Base определяет только property без установщика, поэтому вам нужно включить метод, украшенный @is_ver0.setter, который обрабатывает соответствующие логики c.

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