Home > Net >  TypeError: Can't instantiate abstract class with abstract methods
TypeError: Can't instantiate abstract class with abstract methods

Time:03-31

I've seen similar questions posted here and here, but they don't really answer the problem that I'm having, maybe someone can explain this error to me.

I'm using this backtesting package to create a stock backtesting environment, but I'm making some modifications in my implementation of it. I've created a minimal reproducible example of my main code below:

# pip install backtesting
from backtesting import Strategy

class StrategyParentClass:
    def __init__(self, whatever=True):
        self.whatever=whatever

class StrategyChildClass(StrategyParentClass, Strategy):
    def __init__(self):
        super().__init__()
        self.title="StrategyTitle"

    def next(self):
        print("YAY")

child_class_object = StrategyChildClass()

The code right now gives the error:

Traceback (most recent call last):
  File "test2.py", line 16, in <module>
    child_class_object = StrategyChildClass()
TypeError: Can't instantiate abstract class StrategyChildClass with abstract methods init, next

To explain, I have a parent strategy class, and a child strategy class. The child strategy class inherits the attributes from the parent class, as well as the Strategy class from the backtesting package. When you look at the example code they provide, your strategy class should look like this. So your child class should have a next method in it, which mine does.

However, I'm trying to make my child class inherit from 2 parent classes, which I think is what's giving me the grief. When you delete the , Strategy in the StrategyChildClass(StrategyParentClass, Strategy): line, it'll run without giving an error.

So in this case, how can I instantiate a parent class of my own, and have the child class inherit from IT, AND the imported Strategy class parent, without giving this error? The backtesting package uses this child class' attributes and next method when running the trades.

CodePudding user response:

Your problem is that the Strategy class in that library defines an abstract method called init (not __init__) which you must implement. This is obviously terrible naming on their part because it makes it easy to confuse the init method with the constructor of the class.

CodePudding user response:

I cannot speak to your implementation here, but generally speaking, you must implement abstract methods of any base class in a subclass that calls it. (the two abstract methods in 'Strategy' are 'init' and 'next' and you only had the 'next' method in your subclass. This code should solve it, though may not behave how you intend)

# pip install backtesting
from backtesting import Strategy

class StrategyParentClass:
    def __init__(self, whatever=True):
        self.whatever=whatever

class StrategyChildClass(StrategyParentClass, Strategy):
    def __init__(self):
        super().__init__()
        self.title="StrategyTitle"

    def next(self):
        print("YAY")
    
    def init(self):
        pass

child_class_object = StrategyChildClass()

A good resource that covers this: https://python-course.eu/oop/the-abc-of-abstract-base-classes.php#:~:text=An abstract method is a,implementations for the abstract methods.

  • Related