parent.py
:
class A(object):
def methodA(self):
print("in methodA")
child.py
:
from parent import A
class B(A):
def methodb(self):
print("am in methodb")
Is there anyway to call methodb()
in parent.py
?
Doing this would only make sense if A
is an abstract base class, meaning that A
is only meant to be used as a base for other classes, not instantiated directly. If that were the case, you would define methodB
on class A, but leave it unimplemented:
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")
This isn't strictly necessary. If you don't declare methodB
anywhere in A
, and instantiate B
, you'd still be able to call methodB
from the body of methodA
, but it's a bad practice; it's not clear where methodA
is supposed to come from, or that child classes need to override it.
If you want to be more formal, you can use the Python abc
module to declare A as an abstract base class.
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")
Using this will actually prevent you from instantiating A
or any class that inherits from A
without overriding methodB
. For example, if B looked like this:
class B(A):
pass
You'd get an error trying to instantiate it:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class B with abstract methods methodB
The same would happen if you tried instantiating A
.