小编cha*_*ver的帖子

Python中的工厂模式

我目前正在用Python实现Factory设计模式,我有几个问题.

  1. 有没有办法阻止实际具体类的直接实例化?例如,如果我有一个生成Vehicle的VehicleFactory,我希望用户只使用该工厂,并防止任何人直接意外地实例化Car()或Truck().我可以在init()中抛出异常,但这也意味着工厂无法创建它的实例......

  2. 在我看来,工厂正在上瘾.似乎所有东西都应该成为工厂,这样当我改变内部实现时,客户端代码不会改变.我很想知道什么时候有实际需要使用工厂,什么时候不适合使用.例如,我可能有一个Window类,现在只有这种类型的一个(没有PlasticWindow,ReinforcedWindow或类似的东西).在这种情况下,我是否应该使用工厂为客户端生成Window,以防万一我以后可能会添加更多类型的Windows?

  3. 我只是想知道是否有通常的方式来调用工厂.例如,现在我将我的车辆工厂称为车辆,因此代码将类似于Vehicles.create(...).我看到很多教程就像VehicleFactory一样,但我发现它太长了,它也暴露了实现.

编辑:我所说的"暴露实施"是因为它让人们知道它是一个工厂.我觉得客户不需要知道它是一个工厂,而是作为一个可以为你返回对象的类(当然这是一个工厂,但也许没有必要明确告诉客户那个?).我知道这些代码很容易暴露,所以我并不是说"暴露源代码中实现功能的方式".

谢谢!

python design-patterns factory factory-pattern

22
推荐指数
3
解决办法
2万
查看次数

Python错误检查标准实践

我有一个关于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 error-handling assert

14
推荐指数
2
解决办法
1万
查看次数

从Python列表继承后覆盖append方法

我想创建一个只能接受某些类型的列表.因此,我试图从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)之外还要做什么.

我该怎么做呢?

python inheritance list

13
推荐指数
4
解决办法
2万
查看次数