из семантического POV, наследование описывает отношение "является", поэтому (если ваши дочерние классы уважают принцип замещения Лискова), рыба или медведь уже есть животное. Кроме того, создание «новой копии родительского класса» фактически создаст новые отдельные объекты, что, безусловно, не то, что вам нужно.
Лучшее решение - сохранить регистр (dict) дочерних классов (используя type
в качестве ключа) и предоставить фабричную функцию или метод, то есть:
class Animal(object):
# your code here
# XXX : Q&D code, missing sanity checks and error handling
__registry = {}
@classmethod
def register(cls, subcls):
cls.__registry[subcls.type] = subcls
@classmethod
def create(cls, type, x, y, engine):
return cls.__registry[type](x, y, engine)
class Engine(object):
def create_actors_child(self, actors): # returns parents back
sample = actors[0]
x = sample.x
y = sample.y
for actor in actors:
actor.go_back_event()
self.field.append(Animal.create(sample.type, x, y, self))
Обратите внимание, что на данный момент, если у вас нет другого использования для Animal.type
, вы также можете просто напрямую использовать дочерний класс (и избавиться от реестра):
def create_actors_child(self, actors): # returns parents back
sample = actors[0]
x = sample.x
y = sample.y
for actor in actors:
actor.go_back_event()
samplecls = type(sample)
self.field.append(samplecls(x, y, self))
Вы также можете проверить модуль abc , чтобы узнать о некоторых других усовершенствованных функциях в отношении подклассов и т. Д.