Ricerca…


mixins

Nel linguaggio di programmazione orientato agli oggetti, un mixin è una classe che contiene metodi per l'uso da parte di altre classi senza dover essere la classe madre di quelle altre classi. Il modo in cui quelle altre classi ottengono l'accesso ai metodi del mixin dipende dalla lingua.

Fornisce un meccanismo per l'ereditarietà multipla consentendo a più classi di utilizzare la funzionalità comune, ma senza la semantica complessa dell'ereditarietà multipla. I mix sono utili quando un programmatore vuole condividere funzionalità tra classi diverse. Invece di ripetere lo stesso codice più e più volte, la funzionalità comune può essere semplicemente raggruppata in un mixin e quindi ereditata in ogni classe che lo richiede.

Quando usiamo più di un mix, l'ordine dei mixin è importante. Qui c'è un semplice esempio:

class Mixin1(object):
    def test(self):
        print "Mixin1"

class Mixin2(object):
    def test(self):
        print "Mixin2"

class MyClass(Mixin1, Mixin2):
    pass

In questo esempio chiamiamo MyClass e metodo di test ,

>>> obj = MyClass()
>>> obj.test()
Mixin1

Il risultato deve essere Mixin1 perché l'ordine è da sinistra a destra. Ciò potrebbe mostrare risultati imprevisti quando le super classi aggiungono con esso. Quindi l'ordine inverso è più buono proprio come questo:

class MyClass(Mixin2, Mixin1):
    pass

Il risultato sarà:

>>> obj = MyClass()
>>> obj.test()
Mixin2

I mixin possono essere usati per definire plugin personalizzati.

Python 3.x 3.0
class Base(object):
    def test(self):
        print("Base.")

class PluginA(object):
    def test(self):
        super().test()
        print("Plugin A.")

class PluginB(object):
    def test(self):
        super().test()
        print("Plugin B.")

plugins = PluginA, PluginB

class PluginSystemA(PluginA, Base):
    pass

class PluginSystemB(PluginB, Base):
    pass

PluginSystemA().test()
# Base.
# Plugin A.

 PluginSystemB().test()
# Base.
# Plugin B.

Plugin con classi personalizzate

In Python 3.6, PEP 487 ha aggiunto il metodo speciale __init_subclass__ , che semplifica e estende la personalizzazione della classe senza utilizzare metaclassi . Di conseguenza, questa funzione consente di creare semplici plugin . Qui dimostriamo questa funzionalità modificando un esempio precedente :

Python 3.x 3.6
class Base:
    plugins = []

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.plugins.append(cls)
    
    def test(self):
        print("Base.")

class PluginA(Base):
    def test(self):
        super().test()
        print("Plugin A.")
    

class PluginB(Base):
    def test(self):
        super().test()
        print("Plugin B.")

risultati:

PluginA().test()
# Base.
# Plugin A.

PluginB().test()
# Base.
# Plugin B.

Base.plugins
# [__main__.PluginA, __main__.PluginB]


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow