zoukankan      html  css  js  c++  java
  • Python Mixin混入的使用方法

    DEMO

    # encoding=utf-8 
    __author__ = 'kevinlu1010@qq.com' 
    
    
    class Base(): 
        def f1(self): 
            print 'I am f1 in Base' 
    
        def f2(self): 
            print 'I am f2 in Base' 
    
    class C0(): 
        def f2(self): 
            print 'I am f2 in C0' 
    class C1(C0): 
        def __init__(self): 
            print 'init' 
        def f1(self): 
            print 'I am f1 in C1' 
    
    
    if __name__=='__main__': 
    c = C1() 
    c.f1() 
    c.f2() 
    print C1.__bases__ 
    C1.__bases__ = (Base,)+C1.__bases__ 
    print C1.__bases__ 
    c.f1() 
    c.f2()
    

    输出:

    init
    I am f1 in C1
    I am f2 in C0
    (<class __main__.C0 at 0x02177AB0>,)
    (<class __main__.Base at 0x0053DA78>, <class __main__.C0 at 0x02177AB0>)
    I am f1 in C1
    I am f2 in Base
    

    python的mixin可以实现程序在运行的过程中,动态修改一个类的继承关系。
    一个类的__base__参数会记录这个类的所有继承关系,所以通过修改一个类的__bases__的值,就可以实现动态修改这个类的继承关系。
    上面修改了C1这个类的__bases__=(Base,C0),在前面的类会覆盖后面的类的相同名称的方法或属性,例如这里Base的f2方法会覆盖C0的f2方法
    这个顺序规则与多继承(MRO)是一样的

    Mixin会有个隐患,因为修改继承关系是对一个类操作的,所以当这个类有多个实例的时候,修改__bases__会影响所有的实例,所以可以通过修改实例的__dict__来实现动态加载函数,
    详情参考

  • 相关阅读:
    capwap学习笔记——初识capwap(一)(转)
    capwap学习笔记——capwap的前世今生(转)
    实现一个简单的C++协程库
    c++ 异常处理(1)
    一个浮点数计算的问题
    c++11 中的 move 与 forward
    c++中的左值与右值
    说说尾递归
    boost bind及function的简单实现
    [译] 玩转ptrace (一)
  • 原文地址:https://www.cnblogs.com/Xjng/p/4854208.html
Copyright © 2011-2022 走看看