只能通过Python中的工厂类创建对象 - 与工厂类相关

时间:2014-07-14 13:43:03

标签: python

C ++程序员在这里。

在Python中,如何确保特定类(例如UsefulClass)只能通过其相关的工厂类(例如FactoryClass)创建?但是,与此同时,UsefulClass的公共方法可以直接调用吗?

在C ++中,可以通过将UsefulClass的相关方法设为public,并使其默认构造函数(和任何其他构造函数)为private来轻松实现。相关的FactoryClass(可以是有用类的朋友")可以返回UsefulClass的实例,从而严格控制创建,同时允许用户直接调用UsefulClass的公共方法。

感谢。

3 个答案:

答案 0 :(得分:4)

您可以使构造函数抛出异常:

class UsefulClass(object):

    def __new__(cls, *args, **kwargs):

        raise NotImplementedError("Create UsefulClass instances only with FactoryClass")


class FactoryClass(object):

    def __new__(cls, *args, **kwargs):
        """Do interesting things here, like modifying args and kwargs
        in a fancy way :) then call the default constructor"""
        instance = object.__new__(UsefulClass, *args, **kwargs)
        instance.__init__(*args, **kwargs)
        return instance

此:

UsefulClass()

会抛出异常,而这个:

FactoryClass()

将返回UsefulClass的新实例 请记住: 由于Python的动态特性,UsefulClass的用户仍然可以通过猴子修补来重新定义构造函数。

答案 1 :(得分:0)

我使用以下模式作为对象工厂:

class Foo:
    def __init__(self):
        print 'Inited Foo'

    def say(self):
        print 'Me is Foo!'


class Boo:
    def __init__(self):
        print 'Inited Boo'

    def say(self):
        print 'Me is Boo!'


registrar = {
    'foo': lambda:  Foo(),
    'boo': lambda:  Boo(),
}

然后我可以创建任何实例:

r = reg['foo']()
r.say()
b = reg['boo']()
b.say()

输出:

    >>> Inited Foo
    Me is Foo!
    Inited Boo
    Me is Boo!

答案 2 :(得分:-2)

唐'吨

Python不是C ++,使用以前有效的模式在Python中是愚蠢的。特别是,Python不是"束缚和统治"语言,其中的短语像"从而严格控制创作"不适用。

"如果你不想实例化UsefulClass那么你为什么这么做?" - me

如果您不相信自己或同事阅读并遵守代码的内部文档,那么无论实施语言如何,您都会被搞砸。

相关问题