Хотя наследование является лучшим решением здесь, OP специально запрашивает другое решение
object = Dog()
или object = Cat()
не делает ничего полезного.Он присваивает экземпляр Dog
или Cat
локальной переменной object
, и это все.Он ни к чему не привязывает.
Вы должны будете сохранить ссылку на него в Animal
и привязать Animal.execute
к соответствующему execute
методу.
Также вы можетеиспользуйте словарь, чтобы сделать инициализацию более краткой:
class Dog:
def execute(self):
print("I am a dog")
class Cat:
def execute(self):
print("I am a cat")
class Animal(object):
names_to_classes = {'dog': Dog, 'cat': Cat}
def __init__(self, name=None):
self.name = name
try:
self.object = self.names_to_classes[name]()
except KeyError:
raise TypeError('name must be either "dog" or "cat"')
def execute(self):
self.object.execute()
instanceAnimal = Animal("cat")
instanceAnimal.execute()
instanceAnimal = Animal("dog")
instanceAnimal.execute()
instanceAnimal = Animal("penguin")
instanceAnimal.execute()
output
I am a cat
I am a dog
TypeError: name must be either "dog" or "cat"
Недостатком этого подхода является то, что Dog.__init__
и Cat.__init__
должны приниматьте же аргументы.