2012-10-19 2 views
4

몇 가지 동일한 메소드를 여러 클래스에 추가하는 가장 비효율적 인 방법은 무엇입니까?Pythonic 방법은 여러 클래스에 여러 메소드를 추가합니까?


나는 클래스 장식을 사용할 수 있지만 그 합병증의 공정한 조금 가져올 것하고 더 열심히 작성하고 다른 방법보다 읽기.

나는 모든 메소드를 가진 기본 클래스를 만들 수 있었고 다른 클래스는 상속 받도록 만들었지 만 클래스의 일부에서는 다중 상속을 허용하려는 유혹을받을 수있었습니다. 자주 읽지 않았던 것은 피하거나 최소화해야합니다. 또한 "is-a"관계는 적용되지 않습니다.

또한 오리 값 지정을 통해 값을 적절한 값으로 제공 할 것으로 기대되는 독립 실행 형 함수로 변경 될 수 있습니다. 이것은 어떤면에서는 깨끗하지만 객체 지향성이 적기 때문에 해당 유형의 객체에서 함수를 사용할 수있을 때 명확하지 않습니다.

위임을 사용할 수는 있지만이 경우에는 호출하려는 클래스가 모두 헬퍼 클래스 메서드를 호출하는 메서드를 필요로합니다. 이렇게하면 코드 기반이 다른 옵션보다 훨씬 길어지고 헬퍼 클래스에 새 함수를 추가 할 때마다 위임하는 메소드를 추가해야합니다.

어떤 클래스에서는 하나의 클래스가 다른 클래스의 인스턴스를 제공하는 경우가 있지만 어떤 경우에는 제대로 작동하지만 항상 정상적으로 작동하지는 않으며 그렇지 않은 경우보다 호출이 복잡해질 수 있습니다.

약간의 주위를 놀고 난 후에, 나는 그것이 다중 상속으로 인도 할 때에도 towrds 상속을 기울이고있다. 그러나 다중 텍스트 상속을 허용하는 것에 대해 매우 강력하게 경고하는 수많은 텍스트들 때문에 망설이고, 일부는 (예 : wikipedia 항목과 같이) 코드 재사용을위한 상속 만 최소화해야한다고 말하고 있습니다. 간단한 예를 들어 우리 모두는 x의 위치를 ​​가지고 수많은 별개의 클래스, Y 그리드 다루고 말할 수 있도록


이, 예를 들어 더 명확 할 수있다. 두 개의 엔티티 사이의 거리 나 상대적인 방향, 중간 점 등의 x, y 위치를 가진 모든 메소드를 만들고자 할 때가 있습니다.

이러한 모든 클래스에 속성으로 x와 y가있는 경우에만 의존하는 이러한 메서드에 액세스 할 수있는 가장 비범 한 방법일까요?

답변

3

구체적인 예를 들어, 나는 오리 타이핑을 이용하려고합니다.

def distance(a, b): 
    """ 
    Returns distance between `a` and `b`. 
    `a` and `b` should have `x` and `y` attributes. 
    """ 

    return math.sqrt((a.x-b.x)**2 + (a.y-b.y)**2) 

매우 간단합니다 : xy 특성을 가지고 있다고 가정되는 개체을 일반 간단한 기능을 작성합니다. 함수를 사용하는 방법을 명확히하기 위해 문서화하십시오.

+0

감사합니다.그것은 그것이가는 길일 것 같다. – TimothyAWiseman

2

일반 오래된 기능이이 문제에 가장 좋습니다. 예 : 대신이의 ...

class BaseGeoObject: 

    def distanceFromZeroZero(self): 
    return math.sqrt(self.x()**2 + self.y()**2) 
    ... 

그냥 ... 같은 기능을 가지고이 하나

def distanceFromZeroZero(point): 
    return math.sqrt(point.x()**2 + point.y()**2) 

그것은 또한 테스트하기 쉽기 때문이 좋은 솔루션입니다 - 그냥 운동을 하위 클래스 필요는 없습니다 특정 기능.

관련 문제