我正在使用Python工厂,并希望将所有导入设为“私有”。
这样的事情:
from my_classes import MyClass1, MyClass2
class MyFactory(object):
def __init__(self, class_name):
if class_name == "my_class_1":
return MyClass1()
elif class_name == "my_class_2":
return MyClass2()
在这种情况下,我希望调用者能够使用MyFactory,而不是MyClass1和MyClass2。
我知道Python中没有私有这样的东西。
我尝试的是from my_classes import MyClass1 as _my_class_1
但我收到了一条消息Constant variable imported as non-constant
现在我已经解决了这个问题:
class MyFactory(object):
def __init__(self):
do my init stuff here
def create_myclass_1(self):
from my_classes import MyClass1
return MyClass1()
def create_myclass_2(self):
from my_classes import MyClass2
return MyClass2()
这对我来说看起来不是Pythonic,但我可能错了。
有人能告诉我是否有更好的方法吗?
答案 0 :(得分:-1)
在线之间阅读;你想避免污染你的模块的命名空间,所以导入它的人有更容易的时间吗?
在这种情况下,请使用魔术变量__all__
。
__all__ = ['a', 'b']
def a():
pass
def b():
pass
def c():
pass
如果您将上述示例保存为test.py
,然后from test import
,则可以同时运行a()
和b()
,但会c()
NameError
。
答案 1 :(得分:-2)
您可以创建一个实际的工厂功能
def my_factory(class_name):
if class_name == "my_class_1":
return MyClass1()
elif class_name == "my_class_2":
return MyClass2()
或者,如果你想要更多魔法,并希望它更像是一个类,你可以覆盖__new__
方法。
class FakeClass(object):
def __new__(cls, class_name):
if class_name == "my_class_1":
cls = MyClass1
elif class_name == "my_class_2":
cls = MyClass2
return object.__new__(cls)