2015-12-07 3 views
2

Я пытаюсь динамически создать класс с использованием type() и назначить конструктор __init__, который вызывает super().__init__(...); Однако, когда super() вызывается я получаю следующее сообщение об ошибке:Наследование динамического класса с использованием супер

TypeError: super(type, obj): obj must be an instance or subtype of type 

Вот мой код:

class Item():  
    def __init__(self, name, description, cost, **kwargs): 
     self.name   = name 
     self.description = description 
     self.cost   = cost 
     self.kwargs   = kwargs 

class ItemBase(Item): 
    def __init__(self, name, description, cost): 
     super().__init__(name, description, cost) 

def __constructor__(self, n, d, c): 
    super().__init__(name=n, description=d, cost=c) 

item = type('Item1', (ItemBase,), {'__init__':__constructor__}) 
item_instance = item('MyName', 'MyDescription', 'MyCost') 

Почему super() внутри метод __constructor__ не понимая параметр объекта; и как я могу это исправить?

ответ

1

Вот как я решил проблему. Я ссылаюсь на метод type() динамически создать экземпляр класса с переменной ссылкой как таковые:

def __constructor__(self, n, d, c, h): 
    # initialize super of class type 
    super(self.__class__, self).__init__(name=n, description=d, cost=c, hp=h) 

# create the object class dynamically, utilizing __constructor__ for __init__ method 
item = type(item_name, (eval("{}.{}".format(name,row[1].value)),), {'__init__':__constructor__}) 
# add new object to the global _objects object to be used throughout the world 
self._objects[ item_name ] = item(row[0].value, row[2].value, row[3].value, row[4].value) 

Там может быть лучшим способом для достижения этой цели, но мне нужен исправить, и это то, что я придумал ... использование если можно.

Смежные вопросы