您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python2和python3之间的可移植元类

python2和python3之间的可移植元类

您可以将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注入了额外的基类。

python 2022/1/1 18:43:03 有429人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶