Я хочу, чтобы создать конкретный экземпляр класса, который наследуется от другого конкретного класса, который, в свою очередь, наследуется от абстрактного класса.Установка значений унаследованных свойств
Основная картина:
from abc import ABCMeta, abstractproperty
class Foo(object):
__metaclass__ = ABCMeta
@abstractproperty
def x(self):
pass
@abstractproperty
def y(self):
pass
class Bar(Foo):
x = None
y = None
def __init__(self, x, y):
self.x = x
self.y = y
@property
def x(self):
return self.x
@x.setter
def x(self, value):
self.x = value
@property
def y(self):
return self.y
@y.setter
def y(self, value):
self.y = value
class Baz(Bar):
def __init__(self):
super().__init__(x=2, y=6)
a = Baz()
Когда я пытаюсь создать экземпляр Baz
я получаю ошибку RecursionError: maximum recursion depth exceeded
. (А также предупреждение pylint рассказывал мне о том, что подписи сеттеров не совпадают подписи базового класса)
Однако, если я удалить сеттеры, я получаю сообщение об ошибке self.x = x AttributeError: can't set attribute
Что такое правильный шаблон для этого?
Что вы ожидали от установщика для 'x', который устанавливает' x', вызывающего setter для 'x', который устанавливает' x', вызывающего setter для ... Это не связано с наследованием, t работать в автономном классе. – jonrsharpe
Что-то очень похоже на это. Я не понимаю, как сделать 'x' доступным, без установки для' x'. – Batman
У вас должен быть еще один атрибут, который содержит базовое значение (или, учитывая, что getter и setter ничего не делают, просто прекратите использовать свойство - это не Java!) – jonrsharpe