繁体   English   中英

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

[英]Only creating object through factory class in Python - factory class related

这里的C ++程序员。

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

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

谢谢。

您可以使构造函数引发异常:

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的用户仍可以通过猴子补丁重新定义构造函数。

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

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!

别。

Python不是C ++,使用以前工作过的模式在Python中很愚蠢。 尤其是,Python不是一种“疯子和统治”语言,在该语言中,诸如“因此严格控制创作”之类的短语不适用。

“如果您不想实例化一个UsefulClass那您为什么要UsefulClass ?” -

如果您不信任自己或您的同事阅读和遵循代码的内部文档,那么无论实现语言是什么,您都会为之困惑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM