Python Language
Klasy wtyczek i rozszerzeń
Szukaj…
Mixiny
W języku programowania obiektowego mixin jest klasą, która zawiera metody do wykorzystania przez inne klasy bez konieczności bycia klasą nadrzędną tych innych klas. To, jak te inne klasy uzyskają dostęp do metod miksu, zależy od języka.
Zapewnia mechanizm wielokrotnego dziedziczenia, umożliwiając wielu klasom korzystanie ze wspólnej funkcjonalności, ale bez złożonej semantyki wielokrotnego dziedziczenia. Mixiny są przydatne, gdy programista chce współdzielić funkcje między różnymi klasami. Zamiast powtarzać ten sam kod w kółko, wspólną funkcjonalność można po prostu zgrupować w mixin, a następnie odziedziczyć do każdej klasy, która tego wymaga.
Kiedy używamy więcej niż jednej miksy, kolejność miksów jest ważna. oto prosty przykład:
class Mixin1(object):
def test(self):
print "Mixin1"
class Mixin2(object):
def test(self):
print "Mixin2"
class MyClass(Mixin1, Mixin2):
pass
W tym przykładzie nazywamy MyClass
i metodę test
,
>>> obj = MyClass()
>>> obj.test()
Mixin1
Wynik musi być Mixin1, ponieważ kolejność jest od lewej do prawej. Może to pokazywać nieoczekiwane wyniki, gdy dodają się do niego superklasy. Tak więc odwrotna kolejność jest lepsza:
class MyClass(Mixin2, Mixin1):
pass
Wynik będzie:
>>> obj = MyClass()
>>> obj.test()
Mixin2
Do zdefiniowania niestandardowych wtyczek można użyć miksów.
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.
Wtyczki z niestandardowymi klasami
W Pythonie 3.6 PEP 487 dodał specjalną metodę __init_subclass__
, która upraszcza i rozszerza dostosowanie klasy bez użycia metaklas . W związku z tym ta funkcja umożliwia tworzenie prostych wtyczek . Tutaj demonstrujemy tę funkcję, modyfikując poprzedni przykład :
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.")
Wyniki:
PluginA().test()
# Base.
# Plugin A.
PluginB().test()
# Base.
# Plugin B.
Base.plugins
# [__main__.PluginA, __main__.PluginB]