Выполнение этого будет иметь смысл только в том случае, если A
является абстрактным базовым классом, что означает, что A
предназначен только для использования в качестве базы для других классов, а не для непосредственного создания. Если бы это было так, вы бы определить methodB
на класс А, но оставить его невыполненным:
class A(object):
def methodA(self):
print("in methodA")
def methodB(self):
raise NotImplementedError("Must override methodB")
from parent import A
class B(A):
def methodB(self):
print("am in methodB")
Это не является строго необходимым. Если вы не объявляете methodB
в любом месте A
и создаете экземпляр B
, вы все равно сможете позвонить methodB
с тела methodA
, но это плохая практика; неясно, откуда должно появиться methodA
, или что дочерние классы должны переопределить его.
Если вы хотите быть более формальным, вы можете использовать модуль Python abc
для объявления A как абстрактного базового класса.
from abc import ABCMeta, abstractmethod
class A(object):
__metaclass__ = ABCMeta
def methodA(self):
print("in methodA")
@abstractmethod
def methodB(self):
raise NotImplementedError("Must override methodB")
Используя это будет на самом деле мешает вам инстанцировании A
или любой класс, который наследуется от A
без перекрывая methodB
. Например, если B выглядит следующим образом:
class B(A):
pass
Вы получили бы ошибка при попытке создать его экземпляр:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class B with abstract methods methodB
То же самое произойдет, если вы пытались инстанцировании A
.
Если вам нужно, это довольно значительный запах кода. – roippi
Может быть, я делаю это неправильно, но ищу другого разумного подхода. –
@JagadeeshNM Трудно сказать, что вы можете делать неправильно и как быть умнее, потому что это не очевидно, что вы на самом деле пытаетесь достичь, делая это. Похоже, что ваша проблема связана с несчастливым подходом к вашему более широкому дизайну программы ... – kratenko