2009-12-13 6 views
1

나는 다음과 같은 새 정의가 : 그것은 마지막 줄에 오류가 제기되고메소드에서 인스턴스 참조를 전달하는 방법은 무엇입니까?

class Bird: 
    def __init__(self, swarm, position = None): 
     if (swarm == None): 
      raise ValueError("swarm variable should not be None!") 

     if (not(type(swarm)).__name__ == 'ParticleSwarmOptimization'): 
      raise TypeError("swarm variable must be of type ParticleSwarmOptimization!") 

합니다. 인터프리터에서는 다음을 인쇄합니다.

(type(swarm)).__name__ 
'instance' 

"ParticleSwarmOptimization"을 인쇄 할 것으로 예상됩니다. 나는 새의 생성자 다음과 같은 방법으로 전화 해요 : 나는 모든 새가 주요 ParticleSwarmOptimization 클래스에 대한 참조를 가지고 싶어이와

def AddBird(self, position = None): 
    self.birds += Bird(self, position) 

를, 나는 새가 만들어 질 때마다 나는 사실이 있는지 확인하려면 ParticleSwarmOptimization 인스턴스 참조이며 다른 것은 아닙니다.

감사합니다.

답변

4

사용 : 단순히 변수를 사용하는 대신에

assert isinstance(swarm, ParticleSwarmOptimization) 

파이썬의 문화가 방어 검사의 이러한 종류의 작업을 수행하지 않는 것입니다. 유형이 잘못된 경우 예외가 결국 발생합니다.

0

대신

isinstance 

를 사용해보십시오.

4

다른 사람들이 올바른 방법을 언급했으나 이전 스타일의 클래스를 사용하고 있기 때문에 그 오류가 발생하는 이유가 있습니다. 새로운 스타일의 클래스를 얻으려면 클래스를 하위 클래스로 만듭니다.

+1

+1 새로운 스타일의 클래스를 추천하기 위해 +1 스타일을 포함하여 많은 문제를 수정했습니다 (이 작은 것을 포함하여 ;-). 모두가 말하는대로 isinstance는 여전히 더 좋은 아이디어입니다 ;-). –

관련 문제