如何实现对象的工厂模式生成?

时间:2015-12-05 08:56:45

标签: python factory

请帮助解决问题。我尝试使用工厂模式生成对象'Boat':

from datetime import datetime, date, time
import pprint
import random

class Boat(object):
  def __init__(self, name, max_peoples, max_speed, color_num, oars):
    self.max_peoples = max_peoples
    self.max_speed = max_speed
    self.color_num = color_num
    self.oars = oars
    self.name = name

  def __str__(self):
    return str(self.__class__.__name__) + ': ' + str(self.__dict__)   

class BoatFactory(object):
  def __init__(self, num):
    return Boat(
      name='beda_'+str(num), 
      max_peoples=random.randint(5, 10), 
      max_speed=(random.randint(5, 10)) * 10, 
      color_num=random.randint(1, 5), 
      oars=random.randint(1, 2)
    )    

class FloatFactory(object):
  def __init__(self, num, factory):
    return factory(num)

class World(object):
  def __new__(cls,*dt,**mp):
    if cls.obj is None:
      cls.obj = object.__new__(cls,*dt,**mp)

    return cls.obj    

  def __init__(self):
    self.boats = []

    for i in range(4):
      self.boats.append(FloatFactory(num=i, factory=BoatFactory))

  obj = None

if __name__ == '__main__':
  world1 = World()

  for boat in world1.boats:
    print(boat)

但是,运行脚本后,我收到以下错误消息:

(python3_env)kalinin@kalinin ~/python3/python3_files/boats6 $ python
index.py Traceback (most recent call last):

  File "index.py", line 61, in <module>
    world1 = World()

  File "index.py", line 55, in __init__
    self.boats.append(FloatFactory(num=i, factory=BoatFactory))

  File "index.py", line 41, in __init__
    return factory(num)
     TypeError: __init__() should return None, not 'Boat'

请帮我修复此代码。

1 个答案:

答案 0 :(得分:2)

__init__ cannot return non-None value,你可以让工厂成为职能部门:

##class BoatFactory(object):
##  def __init__(self, num):
##    return Boat(
##      name='beda_'+str(num), 
##      max_peoples=random.randint(5, 10), 
##      max_speed=(random.randint(5, 10)) * 10, 
##      color_num=random.randint(1, 5), 
##      oars=random.randint(1, 2)
##    )    

def BoatFactory(num):
    return Boat(
      name='beda_'+str(num), 
      max_peoples=random.randint(5, 10), 
      max_speed=(random.randint(5, 10)) * 10, 
      color_num=random.randint(1, 5), 
      oars=random.randint(1, 2)
    )

##class FloatFactory(object):
##  def __init__(self, num, factory):
##    return factory(num)

def FloatFactory(num, factory):
    return factory(num)

您也可以让您的课程可以调用,请参阅__call__

class BoatFactory(object):
  def __call__(self, num):
    return Boat(
      name='beda_'+str(num), 
      max_peoples=random.randint(5, 10), 
      max_speed=(random.randint(5, 10)) * 10, 
      color_num=random.randint(1, 5), 
      oars=random.randint(1, 2)
    )    


class FloatFactory(object):
  def __call__(self, num, factory):
    return factory()(num)


class World(object):
  def __new__(cls,*dt,**mp):
    if cls.obj is None:
      cls.obj = object.__new__(cls,*dt,**mp)

    return cls.obj    

  def __init__(self):
    self.boats = []

    for i in range(4):
      self.boats.append(FloatFactory()(num=i, factory=BoatFactory))

  obj = None

或只是将__init__更改为__new__

class BoatFactory(object):
  def __new__(self, num):
    return Boat(
      name='beda_'+str(num), 
      max_peoples=random.randint(5, 10), 
      max_speed=(random.randint(5, 10)) * 10, 
      color_num=random.randint(1, 5), 
      oars=random.randint(1, 2)
    )    


class FloatFactory(object):
  def __new__(self, num, factory):
    return factory(num)

但我发现第一个选项最具可读性