python
  • mixins
  • 2013-06-18 33 views 2 likes 
    2

    有誰知道我可能如何得到下面的代碼工作?在Python中一次混合多個類?

    def mixin(TargetClass, *args, **kwargs): 
        """*args is a bunch of classes to mixin to the TargetClass""" 
        if kwargs.get('name') is None: 
         kwargs['name'] = '%s_mixed_with_%s' % (TargetClass.__name__, "".join(map(str, args))) 
    
        class MixedClass(TargetClass, *args): 
         pass 
    
        MixedClass.__name__ = kwargs.get('name') 
        return MixedClass 
    
    # assume for all intents and purposes that Foo, Bar, Baz, Bot, Quux, and Muck are Classes 
    # Foo should inherit from all of Bar, Baz, Bot, Quux, and Muck 
    def uber_foo = mixin(Foo, Bar, Baz, Bot, Quux, Muck, name="UberFoo")` 
    

    眼下Python解釋器(2.7.5)提出了以下錯誤:

    類型錯誤:錯誤調用元類基地 元類衝突時:一個派生類的元類必須是一個(非嚴格)的所有基地的元類的子類

    +0

    做一些'Foo','Bar','Baz'等等類型有元類嗎? (你可以通過檢查'type(Foo)'來查找並查找任何不是'type'的東西)。如果一組mixin有不止一個不同的元類,你會得到一個關於衝突的錯誤,就像那個你描述。你可以嘗試創建一個組合的元類,但是我擔心它不能正常工作(許多元類有着深刻的魔力,而且它們不可能用頭腦中的協作多重繼承進行編碼)。 – Blckknght

    回答

    5

    怎麼樣:

    return type(kwargs.get('name'),(TargetClass,)+args,{}) 
    

    代替:

    class MixedClass(TargetClass, *args): 
        pass 
    
    MixedClass.__name__ = kwargs.get('name') 
    return MixedClass 
    

    當然,您的腳本的最後一行可能會升起SyntaxError,因爲def whatever = something無效。這應該是:

    UberFoo = mixin(Foo,Bar,Baz,Bot,Quux,Muck,name='UberFoo') 
    
    +0

    我的第二個想法。我的第一個原因是爲什麼不創建一個'AllMixedIn類(Foo,Bar,Baz,Bot,Quux,Muck):pass',然後做'class SomeName(AllMixedIn)'...但是我的+1 –

    +0

    這樣做了招。謝謝!另外我對def的錯誤...... = - 我在Python中一直犯這個錯誤,因爲我在Groovy中做了很多編程,以及def在函數,方法和var聲明之前使用。 –

    相關問題