请帮助解决问题。我尝试使用工厂模式生成对象'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'
请帮我修复此代码。
答案 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)
但我发现第一个选项最具可读性