Python Language
믹스 인
수색…
통사론
- 클래스 클래스 이름 (MainClass, Mixin1, Mixin2, ...)는 # 이름 클래스 이름, 주 (첫째) 클래스 MainClass가있는 클래스를 선언하는 데 사용 및 유지 mixin Mixin1, Mixin2 등
- class ClassName ( Mixin1 , MainClass , Mixin2 , ...) : # 'main'클래스는 반드시 첫 번째 클래스 일 필요는 없습니다. 그것과 mixin 사이에는 아무런 차이가 없습니다.
비고
믹스 인을 클래스에 추가하는 것은 슈퍼 클래스를 추가하는 것과 비슷합니다. 믹스 인 푸와 클래스의 목적은 또한 푸의 인스턴스 및 것 isinstance(instance, Foo)
true를 돌려줍니다
믹스 인
Mixin 은 기본 클래스에서 가져 오지 않은 다른 클래스에서 사용할 수있는 속성 및 메서드 집합입니다. 객체 지향 프로그래밍 언어에서는 일반적으로 상속 을 사용하여 다른 클래스의 객체에 동일한 기능을 제공합니다. 한 세트의 오브젝트가 어떤 능력을 가지고 있다면, 그 능력을 두 오브젝트가 상속받은 기본 클래스에 넣을 수 있습니다.
예를 들어
Car
,Boat
및Plane
수업이 있다고 가정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
도 있습니다. Car
와 Clock
는 기본 클래스 ( Machine
)를 공유 할 수 있습니다. 그러나 모든 기계가 노래를 재생할 수있는 것은 아닙니다. Boat
와 Plane
는 (적어도이 예에서는) 할 수 없습니다. 그럼 어떻게 코드를 복제하지 않고 성취합니까? 믹스 인을 사용할 수 있습니다. 파이썬에서 클래스에 믹스 인을 제공하는 것은 이것을 서브 클래스의리스트에 추가하는 것만 큼 간단합니다.
class Foo(main_super, mixin): ...
Foo
는 main_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 클래스에서 발생한 것을 볼 수 있습니다. 이로 인해 코드 논리에서 예기치 않은 오류가 발생할 수 있으며이를 고려해야합니다.