Looks like I'm either missing something basic or something complicated. I want to store and use a callable
as a class variable in a base class to redefine it in subclasses.
from core.singleton import Singleton
import yaml
class Item:
def __init__(self, arg1, arg2):
self.a = arg1
self.b = arg2
@staticmethod
def from_yaml(id, data):
# some complicated logic to calculate arguments
return Item(arg1, arg2)
class BaseDatabase(metaclass=Singleton):
filename = None
item_class_factory = None
def __init__(self):
# do some checks
with open(self.filename) as f:
self._data = yaml.load(f, yaml.Loader)
def find(self, id):
if id in self._data:
# the line below generates ```TypeError: from_yaml() takes 2 positional arguments but 3 were given```
return self.item_class_factory(id, self._data[id])
class ItemDatabase(BaseDatabase):
filename = 'data/itemsA.yaml'
item_class_factory = Item.from_yaml
class AnotherDatabase(BaseDatabase):
filename = 'data/itemsB.yaml'
item_class_factory = Item.from_yaml
def find_by_name(self, name):
# some extended logic
What am I doing wrong? When I try to execute this code I get Type Error about one extra argument passed to the factory method I'm trying to store in a class variable. Evidently, self
is being passed to. How to avoid it?