是否可以在Python中创建“私有”导入

时间:2016-11-09 07:59:26

标签: python

我正在使用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,但我可能错了。

有人能告诉我是否有更好的方法吗?

2 个答案:

答案 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)