фабрика подключаемых модулей python 3.2: создание экземпляра из класса / метакласса

Я использую информацию здесь: Метакласс не вызывается в подклассах

Моя проблема в том, что я не могу создать экземпляр объекта, используя этот реестр классов. Если я использую «обычные» методы построения, то создается впечатление, что объекты создаются правильно; но когда я пытаюсь использовать объект класса, связанный с реестром, я получаю сообщение об ошибке, заключающееся в том, что я передаю неправильное количество аргументов. (Кажется, это вызов метакласса new , а не моего конструктора ... ??)

Я не понимаю, почему он не работает, потому что я думал, что смогу создать экземпляр из класса объект с использованием "вызываемого" синтаксиса.

Кажется, я помещаю в реестр метакласс, а не сам класс? Но я не вижу простого способа получить доступ к самому классу в вызове new .

Вот мой пример кода, в котором не удалось создать экземпляр переменной 'd':

registry = [] # list of subclasses

class PluginMetaclass(type):
    def __new__(cls, name, bases, attrs):
        print(cls)
        print(name)
        registry.append((name, cls))
        return super(PluginMetaclass, cls).__new__(cls, name, bases, attrs)

class Plugin(metaclass=PluginMetaclass):
    def __init__(self, stuff):
        self.stuff = stuff

# in your plugin modules
class SpamPlugin(Plugin):
    def __init__(self, stuff):
        self.stuff = stuff

class BaconPlugin(Plugin):
    def __init__(self, stuff):
        self.stuff = stuff

c = SpamPlugin(0)
b = BaconPlugin(0)
mycls = registry[1][1]
d = mycls(0)

Спасибо за любую помощь.

9
задан Community 23 May 2017 в 02:16
поделиться