Python Language
Plugin ed Extension Classes
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.
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 :
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]