您可以将MetaDocument()
元类用作工厂来产生 替换 您的Document
类的类,从而重新使用类属性:
class Document(object):
# varIoUs and sundry methods and attributes
body = vars(Document).copy()
body.pop('__dict__', None)
body.pop('__weakref__', None)
Document = MetaDocument(Document.__name__, Document.__bases__, body)
这不需要您手动构建第三个参数,即类主体。
您可以将其变成类装饰器:
def with_Metaclass(mcls):
def decorator(cls):
body = vars(cls).copy()
# clean out class body
body.pop('__dict__', None)
body.pop('__weakref__', None)
return mcls(cls.__name__, cls.__bases__, body)
return decorator
然后用作:
@with_Metaclass(MetaDocument)
class Document(object):
# varIoUs and sundry methods and attributes
或者,为此使用six
库:
@six.add_Metaclass(MetaDocument)
class Document(object):
其中,@six.add_metaclass()
装饰也需要的任何照顾__slots__
你可能已经定义; 我上面的简单版本没有。
six
还有一个six.with_metaclass()
基层工厂:
class Document(six.with_Metaclass(MetaDocument)):
这为MRO注入了额外的基类。