代码之家  ›  专栏  ›  技术社区  ›  intuited

如何将“mixin”类应用于旧式基类

  •  0
  • intuited  · 技术社区  · 14 年前

    我已经编写了一个mixin类,它被设计为在一个新样式类之上分层,例如via

    class MixedClass(MixinClass, BaseClass):
        pass
    

    super 在它的 __init__ 方法,所以这可能是(?)必须改变,否则我会尽量少做改变 MixinClass

    BaseClass

    @old_style_mix(MixinOldSchoolRemix)
    class MixedWithOldStyleClass(OldStyleClass)
    

    哪里 MixinOldSchoolRemix 是从 混合料 重新实现使用 在本例中,使用包含它所混合的类的类变量 OldStyleClass . 这个类变量将由 old_style_mix 作为混合过程的一部分。

    旧式混合 只会更新例如的类字典。 MixedWithOldStyleClass 与mixin类的内容(例如。 MixinOldSchoolRemix公司

    这是一个合理的策略吗?有更好的办法吗?这似乎是一个常见的问题,因为有许多可用的模块仍在使用旧式类。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Alex Martelli    14 年前

    这个类变量将由 过程。

    …我想你的意思是:“…在类上它正在装饰…”而不是“在类上它是它的参数”(后者将是一场灾难)。

    类词典。 将OldStyleClass与 mixin类的内容(例如。

    不好的消息 MixinOldSchoolRemix 派生自 MixinClass 在前者的字典里。所以, old_style_mix 必须采取不同的策略:例如,构建一个新类(我认为必须是一个新类型的类,因为旧类型的类确实如此) 接受新式的 __bases__ )用适当的碱基序列,以及适当调整的字典。

    附上述但书。

    似乎这是一个常见的问题 问题在于 可用模块仍在使用

    …但是,与从未被设计用于混合的类的混合肯定是错误的 一个常见的设计模式,所以这个问题一点都不常见(我不记得在新风格的课程诞生后的很多年里,我都没有见过一次,我积极地咨询,教授高级课程,帮助人们解决Python问题,以及自己做了很多软件开发——我确实倾向于遇到任何“合理常见”的问题,人们可能有与功能已经存在了足够长的时间!-).

    >>> class Mixo(object):
    ...   def foo(self):
    ...     print 'Mixo.foo'
    ...     self.thesuper.foo(self)
    ... 
    >>> class Old:
    ...   def foo(self):
    ...     print 'Old.foo'
    ... 
    >>> class Mixed(Mixo, Old):
    ...   thesuper = Old
    ... 
    >>> m = Mixed()
    >>> m.foo()
    Mixo.foo
    Old.foo
    

    Mixed 以…的名义 Mixo 在你的装潢师里,你可以打电话给 type ,或通过设置 Mixed.__name__ = cls.__name__ (其中 cls

    def oldstylemix(mixin):
        def makemix(cls):
            class Mixed(mixin, cls):
                thesuper = cls
            Mixed.__name__ = cls.__name__
            return Mixed
        return makemix