我有一个类class1,需要继承两个不同的元类Meta1和abc.ABCMeta。
当前实现:
Meta1的实现:
class Meta1(type):
def __new__(cls, classname, parent, attr):
new_class = type.__new__(cls, classname, parent, attr)
return super(Meta1, cls).__new__(cls, classname, parent, attr)
class1Abstract的实现
class class1Abstract(object):
__metaclass__ = Meta1
__metaclass__ = abc.ABCMeta
主类的实现
class mainClass(class1Abstract):
# do abstract method stuff
我知道这样实现两个不同的元类是错误的。
我改变了加载元类的方式(尝试了几种方法),但是出现了以下错误: TypeError: 在调用元类基类时出错
metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
我没有更多的想法了...
编辑1
我尝试了这个解决方案,它可以工作,但是mainClass不是class1Abstract类的实例。
print issubclass(mainClass, class1Abstract) # true
print isinstance(mainClass, class1Abstract) # false
实现class1Abstract类
class TestMeta(Meta1):
pass
class AbcMeta(object):
__metaclass__ = abc.ABCMeta
pass
class CombineMeta(AbcMeta, TestMeta):
pass
class class1Abstract(object):
__metaclass__ = CombineMeta
@abc.abstractmethod
def do_shared_stuff(self):
pass
@abc.abstractmethod
def test_method(self):
''' test method '''
主类的实现
class mainClass(class1Abstract):
def do_shared_stuff(self):
print issubclass(mainClass, class1Abstract) # True
print isinstance(mainClass, class1Abstract) # False
由于mainClass继承自抽象类,Python应该会抱怨mainClass中没有实现test_method方法。但是它没有抱怨任何事情,因为print isinstance(mainClass,class1Abstract)#False
dir(mainClass)
中没有
['__abstractmethods__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry']
求救!
已编辑 2
class1Abstract 类的实现
CombineMeta = type("CombineMeta", (abc.ABCMeta, Meta1), {})
class class1Abstract(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def do_shared_stuff(self):
pass
@abc.abstractmethod
def test_method(self):
''' test method '''
主类的实现
class mainClass(class1Abstract):
__metaclass__ = CombineMeta
def do_shared_stuff(self):
print issubclass(mainClass, class1Abstract) # True
print isinstance(mainClass, class1Abstract) # False
dir(mainClass)
现在具有abstractmethod的魔术方法
['__abstractmethods__', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__metaclass__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry', 'do_shared_stuff', 'test_method']
但是Python并没有警告test_method未被实例化
帮帮我!
mainClass
没有抱怨抽象方法未被实例化?我相信Python没有解决这个问题的方法。与其在类创建时得到错误,不如在对象创建时即mainClass()
得到错误。 - Dunes