2014-09-26 5 views
-1

예를 들어 4 개의 클래스가 있습니다. 1이라는 기본 클래스와 Dog, Cat 및 Mouse라는 3 개의 파생 클래스가 있습니다. 예를 들어 사용자가 개를 선택하면 고양이와 마우스의 이동 기능을 사용하지 않으려합니다. 어떻게해야합니까?Python의 기본 클래스에서 함수 비활성화

그래서 사용자가 선택한 항목에 따라 다른 2 개의 파생 클래스 이동 기능을 사용하지 않도록 설정해야합니다. 이 사용자 동물의 선택은 동적입니다. 세 마리의 동물 모두가 인스턴스화됩니다. 하지만 동물 사용자 선택한다면 사용자

코드 예에 의해 이동 될 수 있습니다

class Pet(object): 

    def __init__(self): 
     #some code 
    def move(self, dx, dy): 
     #some code 

class Cat(Pet): 

    def __init__(self): 
    #some code 

class Dog(Pet): 

    def __init__(self): 
    #some code 

class Mouse(Pet): 

    def __init__(self): 
    #some code 
+0

예외를 발생 시키거나 오류 메시지를 표시하려면 무시하십시오. 그렇지 않으면, move가 유일한 함수이기 때문에 Pet를 서브 클래스 화하지 마십시오. –

+1

질문을 이해할 수 있는지 잘 모르겠습니다. 각 인스턴스는'Dog' 또는'Cat' 또는'Mouse' 일뿐입니다 - 여러분이 인스턴스화 한 것을 기반으로 각 인스턴스에서 하나의'move' 메소드가 호출 될 것입니다. –

+1

나는 따라하지 않는다. 사용자가 개를 선택하면 '개'의 인스턴스를 인스턴스화합니다. 그 시점에서 고양이와 마우스는 어떻게 관련되어 있습니까? 'move' 구현은 어떤 서브 클래스가 사용되는지에 따라 다르게 동작합니까? – dano

답변

3

글쎄, 당신이 할 수있는 한 가지 방법은 "활성"서브 클래스를 지정 Pet에 클래스 변수를 설정하는 것입니다 다음 move가 호출 될 때 확인 :

class Pet(object): 
    active = None 

    def move(self, dx, dy): 
     if Pet.active and isinstance(self, Pet.active): 
      print("Moving") 
     else: 
      # You may want to raise an exception here 
      print("This pet isn't active!") 

    @classmethod 
    def set_active(cls, active_pet): 
     """ Specify the type of the active pet. """ 
     cls.active = active_pet 

class Cat(Pet): 
    pass 

class Dog(Pet): 
    pass 

class Mouse(Pet): 
    pass 

c = Cat() 
d = Dog() 
m = Mouse() 
Pet.set_active(Cat) 
c.move(2,4) 
d.move(2,4) 
m.move(2,4) 

출력 :

Moving 
This pet isn't active! 
This pet isn't active! 

사용자가 활성 인스턴스를 선택하면 Pet.set_active(type_of_pet)으로 전화하면됩니다. 모든 인스턴스를 거치지 않고 선택한 인스턴스에 대해 inst.active = True 외에도 선택되지 않은 모든 인스턴스에 대해 inst.active = False을 설정해야하므로 비슷한 목적을 제공하는 인스턴스 변수를 사용하는 것이 좋습니다.

여기에도 클래스를 건드리지 않고 구현할 수 있으며 사용자가 실제로 사용하기 시작한 인터페이스를 시작하기 위해 실제로 사용하는 인터페이스에 유효성 검사를 넣을 수 있습니다.