[英]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.