我需要一个抽象类来处理缺少的类方法。我找到了如何使用__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()一样。
如果我不使用类方法,它可以正常工作,但我的目的是我的容器中的每个类都无法实例化,因为它对我的需求毫无用处。这是一种单身人士模式。
是否更容易理解?