2012-07-14 4 views
1

아마도 내 디자인이 완전히 엉망입니다.하지만 필자가 비교할 수있는 파생 클래스 객체가 2 개있는 경우 클래스 D1은 기본적으로 항상 클래스 D2가됩니다. (아이비 브릿지와 286을 비교한다고 가정 해보십시오). isinstance (D2)를 사용하지 않고 D1 클래스의 비교를 구현하려면 어떻게해야합니까? Comparing two objectsIf duck-typing in Python, should you test isinstance?python은 2 개의 비슷한 오브젝트를 오리 타이핑과 비교합니다.

은 내가 "유형"속성을 추가 한 다음 유형을 비교,하지만 나뿐만 아니라 isinstance를 사용할 수 있습니다 수 :

나는이를 보았다. 가장 쉬운 방법은 isinstance를 사용하는 것입니다 ... 더 좋은 제안이 있습니까?

+2

isinstance를 사용할 때 잘못된 점을 잘 모르겠습니다. – jterrace

+0

@jterrace 잘 모르겠지만 여러 곳에서 읽은 테스트 유형은 파이썬에서는 좋지 않습니다. 따라서 더 나은 제안이 있는지보고 싶을뿐입니다. – chemelnucfin

+0

"2 파생 된 클래스 개체"- 확인하는 것은 같은 기지에서 나온 것입니까? –

답변

1

내가 이런 짓을 할 것이다 :

class D1(object): 
    def __val_cmp(self, other): 
     # compare by attributes here 
     if self.attr < other.attr: 
     return -1 
     elif self.attr > other.attr: 
     return 1 
     return 0 

    def __cmp__(self, other): 
     greater = isinstance(other, type(self)) 
     lesser = isinstance(self, type(other)) 
     if greater and lesser: 
     # same type so compare by attributes 
     return self.__val_cmp(other) 
     elif greater: 
     return 1 
     elif lesser: 
     return -1 
     else: 
     # other type is not a parent or child type, so just compare by attributes 
     return self.__val_cmp(other) 
  • 를 D2는 D1의 하위 유형 인 경우, D2의 인스턴스는 항상 D1의 경우보다 비교합니다.
  • D0이 상위 유형의 D1 인 경우 D0의 인스턴스는 항상 D1 인스턴스보다 더 큽니다.
  • D1의 인스턴스를 다른 인스턴스 인 D1과 비교하면 해당 클래스의 특성이 비교됩니다. 알 수없는 클래스의 인스턴스 D1의 인스턴스를 비교하면
  • 는 비교가 클래스의 속성
+1

'cmp'는 python3에서 사라졌지 만, 근본적인 아이디어는 견고하다고 생각합니다. (+1) – mgilson

2

나 자신을 물어 보곤으로 될 것이다 "는 D1보다 항상 더하게 D2에 대해 무엇인가? " 다른 말로하면, 그것들은 비교를 토대로하는 것이 합리적 일 것이라는 공통적 인 속성을 가지고 있는가? 이 질문에 대한 좋은 대답이 없다면이 두 객체에 대한 비교를 만드는 것이 실제로 의미가 있는지 물을만한 가치가있을 것입니다.

IF를 고려한 후에도 여전히 비교를하는 것이 좋은 생각이라고 생각하면 isinstance을 사용하십시오. 언어에 여전히 존재하는 이유가 있습니다. 파이썬은 항상 나쁜 연습으로 간주되는 것을 비하합니다. 이는 isinstance이 항상 나쁜 것은 아니라는 것을 의미합니다.

문제는 isinstance가 불필요하게 형식 검사를 수행하는 데 사용되는 경우입니다. 다시 말해, 사용자는 완전히 "불필요한 도약"컨텍스트에서이를 사용합니다. 사용자가 기능으로 푸처럼 충분히 보이는 뭔가를 넣어하지 않는 경우이 경우

if not isinstance(arg,Foo): 
    raise ValueError("I want a Foo") 

, 어쨌든 예외가 발생합니다. Foo 객체로만 제한하는 이유는 무엇입니까? 그러나 귀하의 경우 실제로는 개념적 관점에서 볼 때 대상의 유형이 중요합니다. 이것이 isinstance이 존재하는 이유입니다 (제 생각에는).

관련 문제