【发布时间】:2015-10-01 11:43:01
【问题描述】:
我有一个 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
我知道两次实现 2 个不同的元数据是错误的。
我改变了加载metclass的方式(几次尝试),我明白了 TypeError:调用元类库时出错
metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
我的想法用完了......
EDITED 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 '''
mainClass的实现
class mainClass(class1Abstract):
def do_shared_stuff(self):
print issubclass(mainClass, class1Abstract) # True
print isinstance(mainClass, class1Abstract) # False
由于 mainClass 继承自一个抽象类,python 应该抱怨 test_method 没有在 mainClass 中实现。但它并没有抱怨什么,因为 print isinstance(mainClass, class1Abstract) # False
dir(mainClass)
没有
['__abstractmethods__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry']
帮助!
EDITED 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 '''
mainClass的实现
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 没有被实例化
帮助!
【问题讨论】:
-
这只是python 2吗?
-
所以你的主要问题是
mainClass没有抱怨抽象方法没有实例化?我相信python没有提供解决这个问题的方法。而不是在类创建时出现错误,而是在对象创建时出现错误,即。mainClass().
标签: python metaprogramming metaclass