2012-07-30 3 views
2

PHP 응용 프로그램을 작성했는데 PHP에서 좋은 방법으로 해결할 수없는 문제가 있습니다. 그래서 Ruby 나 Python으로 옮기는 것을 생각하고 있습니다. 전에 사용하지 못했던 두 언어입니다. 지금까지이 문제를 루비에서 해결할 수 있다는 것을 알았습니다. 파이썬에서도이 문제를 해결할 수 있을지 궁금합니다.파이썬에서 프로토 타입 지향적 기능?

응용 프로그램의 핵심 부분에는 확장하려는 클래스 A가 있습니다. 메소드 doFoo에 의해 A를 확장하는 확장 기능 E1와, doBar 메소드에 의해 A를 확장하는 확장 기능 E2가 1 개 있습니다. 이제 A, E1 또는 E2 코드를 변경하지 않고 두 확장을 모두 사용하려고합니다. PHP에서 이것은 A를 확장하는 클래스 B를 제공하고 E1과 E2에서 형질 또는 다른 더러운 속임수를 섞어서 세 번째 확장자 인 E3을 작성하여 보관할 수 있습니다. 하지만 핵심을 가지고이 두 확장을 사용하고 모든 정보를 함께 넣는 __call()을 사용하지 않고 더 이상 클래스를 사용할 필요가없이 "확장 E1 및 E2 사용"에 대한 정보를 갖고 싶습니다.).

파이썬에서는 가능합니까? 런타임에 변경 될 수있는 프로토 타입이 필요하지 않습니다. A의 모든 인스턴스에는 doFoo 및 doBar가 있어야합니다.

편집 :이 모든 것은이 (E1없이) 만 E2로 모두 확장을, (E2없이) E1 전용으로, 확장없이 작동합니다.

+1

잘 모르겠습니다. 간단한 상속을 사용할 수없는 이유는 무엇입니까? – mgilson

+0

아, 잊어 버렸습니다. E1은 E2 없이도 사용할 수 있어야하며 E2도 E2없이 사용할 수 있어야합니다. 고맙습니다. – stofl

+1

@stofl : "E1"이라는 뜻인가요? – gahooa

답변

2

mailson이 제안했듯이 다중 상속이 필요합니다. 간단한

class E(A, E1, E2): 
    ... 

필요한 것을해야합니다.

편집 :

E = type("E", (A, E1, E2), {}) 

EDIT2 : 두글 그것에 나를 이길 : 당신은 다음과 같이 하드 코딩없이 제안 된 다중 상속을 할 수있는 D

+1

이것은 커스텀 클래스 E를 (하드) 코딩한다는 뜻인가요? "E1 및 E2 사용"코드를 작성하고 싶지 않습니다. 클래스 E 코드 자동 생성과 같은 기능을 사용하지 않고 구성하고 싶습니다. – stofl

+0

대단히 고마워요! – stofl

1

:

는 동적 타입 사용할 수 있습니다 수행

class E(A, E1, E2): 
    pass 
을하는 것과 같다
mixins = (E1, E2) 
E = type('E', (A,) + mixins, {}) 

하지만 믹스 인을 동적으로 지정할 수 있습니다.

+0

감사합니다. 그게 전부! – stofl