I need something like an abstract protected
method in Python (3.2):
class Abstract:
def use_concrete_implementation(self):
print(self._concrete_method())
def _concrete_method(self):
raise NotImplementedError()
class Concrete(Abstract):
def _concrete_method(self):
return 2 * 3
Is it actually useful to define an "abstract" method only to raise a NotImplementedError?
Is it good style to use an underscore for abstract methods, that would be protected
in other languages?
Would an abstract base class (abc) improve anything?
Basically, an empty method in the base class is not necessary here. Just do it like this:
In fact, you usually don't even need the base class in Python. Since all calls are resolved dynamically, if the method is present, it will be invoked, if not, an
AttributeError
will be raised.Attention: It is import to mention in the documentation that
_concrete_method
needs to be implemented in subclasses.When in doubt, do as Guido does.
No underscore. Just define the "abstract method" as a one-liner which raises NotImplementedError:
In Python, you usually avoid having such abstract methods alltogether. You define an interface by the documentation, and simply assume the objects that are passed in fulfil that interface ("duck typing").
If you really want to define an abstract base class with abstract methods, this can be done using the
abc
module:Again, that is not the usual Python way to do things. One of the main objectives of the
abc
module was to introduce a mechanism to overloadisinstance()
, butisinstance()
checks are normally avoided in favour of duck typing. Use it if you need it, but not as a general pattern for defining interfaces.