Каково самое короткое / самый изящный способ реализовать следующий код Scala с абстрактным атрибутом в Python?
abstract class Controller {
val path: String
}
Подкласс Controller
осуществляется для определения "пути" компилятором Scala. Подкласс был бы похож на это:
class MyController extends Controller {
override val path = "/home"
}
Python имеет встроенное исключение для этого, хотя вы не встретите исключение до времени выполнения.
class Base(object):
@property
def path(self):
raise NotImplementedError
class SubClass(Base):
path = 'blah'
В ответе Бастьена Леонара упоминается модуль абстрактного базового класса, а в ответе Брендана Абеля речь идет о нереализованных атрибутах, вызывающих ошибки. Чтобы гарантировать, что класс не реализован вне модуля, вы можете префикс базового имени с подчеркиванием, которое обозначает его как частный для модуля (т.е. он не импортируется).
т.е.
class _Controller(object):
path = '' # There are better ways to declare attributes - see other answers
class MyController(_Controller):
path = '/Home'
Взгляните на модуль abc (Abtract Base Class): http://docs.python.org/library/abc.html
Однако, на мой взгляд, самым простым и распространенным решением является вызывать исключение при создании экземпляра базового класса или при обращении к его свойству.