缺少类方法的Python魔术方法?

时间:2017-10-03 16:16:26

标签: python-3.x

我需要一个抽象类来处理缺少的方法。我找到了如何使用__getattr__进行此方法,但它不能与类方法一起使用。它甚至可能吗?

我有这样的事情:

class Container:
    _definitions = {'class_a': 'example.class_a.ClassA', 
                    'class_b': 'example.class_b.ClassB'}

    @classmethod
    def get(cls, def_id):
        # import dynamicaly
        parts = cls._definitions[def_id].split(".")
        module_name = ".".join(parts[:-1])
        class_name = parts[-1]
        __import__(module_name)
        return class_name


class AbstractClass:
    @classmethod
    def __getattr__(cls, name, *args):
        def missing_method():
            result = re.search("^(?P<class_id>[a-z0-9._-]*)$", name)
            if result:
                return Container.get(result.group('class_id'))
            raise RuntimeError("class method '{}' missing from class".format(name))

        return missing_method

class ClassA(AbstractClass):
    @classmethod
    def method(cls):
        classb = cls.class_a()
        classb.method()

class ClassB(AbstractClass):
    @classmethod
    def method(cls):
        print('Hello world')

我的Container中的每个类都必须扩展AbstractClass,以便能够神奇地调用其中的任何类,就像我执行un classA.method()一样。

如果我不使用类方法,它可以正常工作,但我的目的是我的容器中的每个类都无法实例化,因为它对我的需求毫无用处。这是一种单身人士模式。

是否更容易理解?

0 个答案:

没有答案