2014-09-26 4 views
-1

Например, у меня есть 4 класса. 1 базовый класс под названием Pet и три производных класса, называемых Dog, Cat и Mouse. Если пользователь выбирает собаку, например, я хотел бы отключить функцию перемещения кошки-мышки. Как мне это сделать?Отключение функции в базовом классе в 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

Отменить его, чтобы выбросить исключение или отобразить сообщение об ошибке. В противном случае не подклассифицируйте Pet, так как перемещение является единственной функцией. –

+1

Я не уверен, что понимаю ваш вопрос. Каждый экземпляр будет только «Собака» или «Кошка» или «Мышь» - только один метод «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 = False для всех не выбранных экземпляров, в дополнение к inst.active = True для выбранного экземпляра.

Вы также можете реализовать это, не касаясь каких-либо классов здесь, и поместить проверку в любой интерфейс, который пользователь фактически использует, чтобы попытаться перенести экземпляры для начала.

Смежные вопросы