수색…


통사론

  • 클래스 클래스 이름 (MainClass, Mixin1, Mixin2, ...)는 # 이름 클래스 이름, 주 (첫째) 클래스 MainClass가있는 클래스를 선언하는 데 사용 및 유지 mixin Mixin1, Mixin2
  • class ClassName ( Mixin1 , MainClass , Mixin2 , ...) : # 'main'클래스는 반드시 첫 번째 클래스 일 필요는 없습니다. 그것과 mixin 사이에는 아무런 차이가 없습니다.

비고

믹스 인을 클래스에 추가하는 것은 슈퍼 클래스를 추가하는 것과 비슷합니다. 믹스 인 푸와 클래스의 목적은 또한 푸의 인스턴스 및 것 isinstance(instance, Foo) true를 돌려줍니다

믹스 인

Mixin 은 기본 클래스에서 가져 오지 않은 다른 클래스에서 사용할 수있는 속성 및 메서드 집합입니다. 객체 지향 프로그래밍 언어에서는 일반적으로 상속 을 사용하여 다른 클래스의 객체에 동일한 기능을 제공합니다. 한 세트의 오브젝트가 어떤 능력을 가지고 있다면, 그 능력을 두 오브젝트가 상속받은 기본 클래스에 넣을 수 있습니다.

예를 들어 Car , BoatPlane 수업이 있다고 가정 Plane . 이 모든 클래스의 객체는 여행 할 수 있으므로 여행을 할 수 travel . 이 시나리오에서는 모두 동일한 기본 방식으로 이동합니다. 경로를 얻고 그것을 따라 이동합니다. 이 함수를 구현하려면 Vehicle 에서 모든 클래스를 파생시키고 해당 공유 클래스에 함수를 넣을 수 있습니다.

class Vehicle(object):
   """A generic vehicle class."""

   def __init__(self, position):
       self.position = position

   def travel(self, destination):
       route = calculate_route(from=self.position, to=destination)
       self.move_along(route)

class Car(Vehicle):
   ...

class Boat(Vehicle):
   ...

class Plane(Vehicle):
   ...

이 코드를 사용하면 호출 할 수있는 travel 차에 ( car.travel("Montana") ), 보트 ( boat.travel("Hawaii") (), 비행기 plane.travel("France") )

그러나 기본 클래스에서 사용할 수없는 기능이 있다면 어떻게해야합니까? 예를 들어 Car 에 라디오를 제공하고 play_song_on_station 과 함께 라디오 방송국에서 노래를 재생할 수있는 기능을 제공하려는 경우에도 라디오를 사용할 수있는 Clock 도 있습니다. CarClock 는 기본 클래스 ( Machine )를 공유 할 수 있습니다. 그러나 모든 기계가 노래를 재생할 수있는 것은 아닙니다. BoatPlane 는 (적어도이 예에서는) 할 수 없습니다. 그럼 어떻게 코드를 복제하지 않고 성취합니까? 믹스 인을 사용할 수 있습니다. 파이썬에서 클래스에 믹스 인을 제공하는 것은 이것을 서브 클래스의리스트에 추가하는 것만 큼 간단합니다.

class Foo(main_super, mixin): ...

Foomain_super 의 모든 속성과 메서드뿐만 아니라 mixin 의 속성과 메서드도 상속받습니다.

그래서, 클래스 제공하는 Car 와 시계에게 라디오를 사용하는 능력, 당신이 무시할 수있는 Car 마지막 예제에서이 쓰기를 :

class RadioUserMixin(object):
   def __init__(self):
       self.radio = Radio()

   def play_song_on_station(self, station):
       self.radio.set_station(station)
       self.radio.play_song()

class Car(Vehicle, RadioUserMixin):
   ...

class Clock(Vehicle, RadioUserMixin):
   ...

이제 car.play_song_on_station(98.7)clock.play_song_on_station(101.3) 호출 할 수 있지만 boat.play_song_on_station(100.5) 와 같은 것은 아닙니다.

믹스 인의 중요한 점은이 기능을 가진 "메인"서브 클래스를 공유하지 않지만 그럼에도 불구하고 여전히 코드를 공유하고있는 많은 다른 객체에 기능을 추가 할 수 있다는 것입니다. 믹스 인이 없으면 위의 예제와 같은 일을하는 것이 훨씬 더 어려워 지거나 약간의 반복이 필요할 수 있습니다.

Mixins의 메소드 오버라이드

믹스 인은 추가 속성 및 메서드를 클래스에 "혼합"하는 데 사용되는 일종의 클래스입니다. mixin 클래스가 서로 또는 기본 클래스의 메서드를 재정의하지 않는 경우가 많으므로 일반적으로 좋습니다. 그러나 믹스 인에서 메서드 나 속성을 재정의하면 예기치 않은 결과가 발생할 수 있습니다. Python에서는 클래스 계층이 오른쪽에서 왼쪽으로 정의되기 때문입니다.

예를 들어 다음과 같은 수업을 듣습니다.

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

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

class BaseClass(object):
    def test(self):
        print "Base"

class MyClass(BaseClass, Mixin1, Mixin2):
    pass

이 경우 Mixin2 클래스는 Mixin1에 의해 확장되고 마지막으로 BaseClass에 의해 확장되는 기본 클래스입니다. 따라서 다음 코드 스 니펫을 실행하면 :

>>> x = MyClass()
>>> x.test()
Base

반환 된 결과가 Base 클래스에서 발생한 것을 볼 수 있습니다. 이로 인해 코드 논리에서 예기치 않은 오류가 발생할 수 있으며이를 고려해야합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow