수색…


믹스 인

객체 지향 프로그래밍 언어에서, mixin은 다른 클래스의 부모 클래스 일 필요없이 다른 클래스에 의해 사용되는 메소드를 포함하는 클래스입니다. 다른 클래스가 mixin의 메서드에 액세스하는 방법은 언어에 따라 다릅니다.

다중 상속의 복잡한 의미론없이 여러 클래스가 공통 기능을 사용할 수있게하여 다중 상속 메커니즘을 제공합니다. Mixins는 프로그래머가 다른 클래스간에 기능을 공유하고자 할 때 유용합니다. 동일한 코드를 반복해서 반복하는 대신 공통 기능을 믹스 인으로 그룹화 한 다음이를 필요로하는 각 클래스로 상속받을 수 있습니다.

하나 이상의 mixin을 사용할 때, mixin의 순서가 중요합니다. 다음은 간단한 예입니다.

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

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

class MyClass(Mixin1, Mixin2):
    pass

이 예제에서는 MyClasstest 메소드를 호출하고,

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

Order가 오른쪽에서 왼쪽이므로 결과는 Mixin1이어야합니다. 수퍼 클래스가 추가되면 예기치 않은 결과가 나타날 수 있습니다. 이렇게 역순으로 정렬하면됩니다.

class MyClass(Mixin2, Mixin1):
    pass

결과는 다음과 같습니다.

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

Mixins은 맞춤 플러그인을 정의하는 데 사용할 수 있습니다.

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.

사용자 정의 클래스가있는 플러그인

Python 3.6에서 PEP 487메타 클래스 를 사용하지 않고 클래스 사용자 정의를 단순화하고 확장하는 __init_subclass__ 특수 메소드를 추가했습니다. 따라서이 기능을 사용하면 간단한 플러그인 을 만들 수 있습니다 . 여기에서는 이전 예제 를 수정하여이 기능을 보여줍니다.

파이썬 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.")

결과 :

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
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow