在python中禁用基类中的函数

时间:2014-09-26 16:37:36

标签: python pygame

例如,我有4个班级。 1个名为Pet的基类和3个名为Dog,Cat和Mouse的派生类。例如,如果用户选择狗,我想禁用猫和鼠标的移动功能。我该怎么做呢?

因此,根据用户选择的内容,需要禁用其他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

1 个答案:

答案 0 :(得分:3)

嗯,你可以这样做的一种方法是在Pet上设置一个类变量,它指定" active"子类,然后在调用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。 {1}}用于所选实例。

您也可以在不触及任何类的情况下实现此功能,并将验证放在用户实际用于尝试移动实例的任何界面中。