C ++程序员在这里。
在Python中,如何确保特定类(例如UsefulClass)只能通过其相关的工厂类(例如FactoryClass)创建?但是,与此同时,UsefulClass的公共方法可以直接调用吗?
在C ++中,可以通过将UsefulClass的相关方法设为public,并使其默认构造函数(和任何其他构造函数)为private来轻松实现。相关的FactoryClass(可以是有用类的朋友")可以返回UsefulClass的实例,从而严格控制创建,同时允许用户直接调用UsefulClass的公共方法。
感谢。
答案 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 。
如果您不相信自己或同事阅读并遵守代码的内部文档,那么无论实施语言如何,您都会被搞砸。