我目前正在用Python实现Factory设计模式,我有几个问题.
有没有办法阻止实际具体类的直接实例化?例如,如果我有一个生成Vehicle的VehicleFactory,我希望用户只使用该工厂,并防止任何人直接意外地实例化Car()或Truck().我可以在init()中抛出异常,但这也意味着工厂无法创建它的实例......
在我看来,工厂正在上瘾.似乎所有东西都应该成为工厂,这样当我改变内部实现时,客户端代码不会改变.我很想知道什么时候有实际需要使用工厂,什么时候不适合使用.例如,我可能有一个Window类,现在只有这种类型的一个(没有PlasticWindow,ReinforcedWindow或类似的东西).在这种情况下,我是否应该使用工厂为客户端生成Window,以防万一我以后可能会添加更多类型的Windows?
我只是想知道是否有通常的方式来调用工厂.例如,现在我将我的车辆工厂称为车辆,因此代码将类似于Vehicles.create(...).我看到很多教程就像VehicleFactory一样,但我发现它太长了,它也暴露了实现.
编辑:我所说的"暴露实施"是因为它让人们知道它是一个工厂.我觉得客户不需要知道它是一个工厂,而是作为一个可以为你返回对象的类(当然这是一个工厂,但也许没有必要明确告诉客户那个?).我知道这些代码很容易暴露,所以我并不是说"暴露源代码中实现功能的方式".
谢谢!
我有一个关于Python中的错误检查的问题.假设我有一个将文件路径作为输入的函数:
def myFunction(filepath):
infile = open(filepath)
#etc etc...
Run Code Online (Sandbox Code Playgroud)
一个可能的先决条件是文件应该存在.
有几种可能的方法来检查这个前提条件,我只是想知道最好的方法是什么.
i)检查if语句:
if not os.path.exists(filepath):
raise IOException('File does not exist: %s' % filepath)
Run Code Online (Sandbox Code Playgroud)
这是我通常会这样做的方式,尽管如果文件不存在,Python会引发相同的IOException,即使我没有提出它.
ii)使用assert检查前提条件:
assert os.path.exists(filepath), 'File does not exist: %s' % filepath
Run Code Online (Sandbox Code Playgroud)
使用asserts似乎是检查前/后条件的"标准"方式,所以我很想使用它们.但是,在执行期间使用-o标志时,可能会关闭这些断言,这意味着可能会关闭此检查,这似乎有风险.
iii)根本不处理前提条件
这是因为如果filepath不存在,则无论如何都会生成异常,并且异常消息足够详细,以便用户知道该文件不存在
我只是想知道上面哪一项是我应该用于我的代码的标准做法.
我想创建一个只能接受某些类型的列表.因此,我试图从Python中的列表继承,并覆盖append()方法,如下所示:
class TypedList(list):
def __init__(self, type):
self.type = type
def append(item)
if not isinstance(item, type):
raise TypeError, 'item is not of type %s' % type
self.append(item) #append the item to itself (the list)
Run Code Online (Sandbox Code Playgroud)
这将导致无限循环,因为append()的主体调用自身,但我不知道除了使用self.append(item)之外还要做什么.
我该怎么做呢?