Ошибка в factory. Как исправить? Помогите пожалуйста исправить ошибку. Я пытаюсь применить на практике шаблон проектирования "Фабрика". from datetime import datetime, date, time class GameElement(object): def __init__(self, name): self.name = name class Boat(GameElement): def __init__(self, name, peoples, speed, color, oars): GameElement.__init__(self, name) self.peoples = peoples self.speed = speed self.color = color self.oars = oars Boat.quantity += 1 quantity = 0 def __str__(self): return str(self.__class__.__name__) + ': ' + str(self.__dict__) class Raft(GameElement): def __init__(self, name, peoples, speed, color, sails): GameElement.__init__(self, name) self.peoples = peoples self.speed = speed self.color = color self.sails = sails Raft.quantity += 1 quantity = 0 def __str__(self): return str(self.__class__.__name__) + ': ' + str(self.__dict__) class BoatsGenerator(object): def factory(self, name, peoples, speed, color, oars): print(str(name) + '::' + 'created boat') #return Boat(name, peoples, speed, color, oars) class RaftsGenerator(object): def factory(name, peoples, speed, color, sails): print(str(name) + '::' + 'created raft') #return Raft(name, peoples, speed, color, sails) class World(object): def __new__(cls,*dt,**mp): if cls.obj is None: cls.obj = object.__new__(cls,*dt,**mp) World.quantity += 1 boat1 = BoatsGenerator.factory(name='beda', peoples=8, speed=110, color='red', oars=2) raft1 = RaftsGenerator.factory(name='abibas', peoples=3, speed=5, color='maroon', sails=0)
print(boat1) print(raft1) return cls.obj obj = None quantity = 0 def __str__(self): return str(self.__class__.__name__) + ': ' + str(self.__dict__) world1 = World() world1.creared_at = datetime.now().strftime("%A, %d. %B %Y %I:%M%p") print(world1) print('worlds quantity: ' + str(World.quantity)) В этом коде есть классы для объектов Boat и Raft, а так же фабрики для каждого из них(BoatsGenerator, RaftsGenerator). Сама процедура создания происходит в инициализаторе класса World. В результате должно получиться 2 объекта, но у меня консоль выводит сообщение об ошибке:kalinin@kalinin ~/python/boats3 $ python index.py Traceback (most recent call last): File "index.py", line 74, in world1 = World() File "index.py", line 58, in __new__ boat1 = BoatsGenerator.factory(name='beda', peoples=8, speed=110, color='red', oars=2) TypeError: unbound method factory() must be called with BoatsGenerator instance as first argument (got nothing instead)
Чтобы исправить эту ошибку, вы должны вызывать метод factory с помощью экземпляра класса BoatsGenerator. Для этого нужно создать экземпляр класса BoatsGenerator в методе new класса World.
Вот как вы можете это сделать:
Измените метод new класса World следующим образом:class World(object): def __new__(cls,*dt,**mp): if cls.obj is None: cls.obj = object.__new__(cls,*dt,**mp) World.quantity += 1 boatsGenerator = BoatsGenerator() boat1 = boatsGenerator.factory(name='beda', peoples=8, speed=110, color='red', oars=2) raftsGenerator = RaftsGenerator() raft1 = raftsGenerator.factory(name='abibas', peoples=3, speed=5, color='maroon', sails=0) print(boat1) print(raft1) return cls.obj Исправьте определение метода factory в классах BoatsGenerator и RaftsGenerator, чтобы он стал статическим методом:class BoatsGenerator(object): @staticmethod def factory(name, peoples, speed, color, oars): print(str(name) + '::' + 'created boat') #return Boat(name, peoples, speed, color, oars) class RaftsGenerator(object): @staticmethod def factory(name, peoples, speed, color, sails): print(str(name) + '::' + 'created raft') #return Raft(name, peoples, speed, color, sails)
После внесения этих изменений ваш код должен работать правильно и создавать объекты Boat и Raft через соответствующие фабрики.
Чтобы исправить эту ошибку, вы должны вызывать метод factory с помощью экземпляра класса BoatsGenerator. Для этого нужно создать экземпляр класса BoatsGenerator в методе new класса World.
Вот как вы можете это сделать:
Измените метод new класса World следующим образом:class World(object):def __new__(cls,*dt,**mp):
if cls.obj is None:
cls.obj = object.__new__(cls,*dt,**mp)
World.quantity += 1
boatsGenerator = BoatsGenerator()
boat1 = boatsGenerator.factory(name='beda', peoples=8, speed=110, color='red', oars=2)
raftsGenerator = RaftsGenerator()
raft1 = raftsGenerator.factory(name='abibas', peoples=3, speed=5, color='maroon', sails=0)
print(boat1)
print(raft1)
return cls.obj Исправьте определение метода factory в классах BoatsGenerator и RaftsGenerator, чтобы он стал статическим методом:class BoatsGenerator(object):
@staticmethod
def factory(name, peoples, speed, color, oars):
print(str(name) + '::' + 'created boat')
#return Boat(name, peoples, speed, color, oars)
class RaftsGenerator(object):
@staticmethod
def factory(name, peoples, speed, color, sails):
print(str(name) + '::' + 'created raft')
#return Raft(name, peoples, speed, color, sails)
После внесения этих изменений ваш код должен работать правильно и создавать объекты Boat и Raft через соответствующие фабрики.