例如,我有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
答案 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}}用于所选实例。
您也可以在不触及任何类的情况下实现此功能,并将验证放在用户实际用于尝试移动实例的任何界面中。