如何设置pythonpackage/module目录和class定义直观命名

How to set up python package/module directory and class definition for intuitive naming

我一直在寻找这个,但找不到任何东西。我是一名经验丰富的程序员,但最近切换到 Python。

简而言之,我想 expand/evolve 一个面向对象的相关库 class 到一个具有多个独立文件的命名空间(由于复杂性和增加模块化的愿望):

目前,我可能有:

# file lib/NameSpace.py

class Foo(object):
     def __init__(self):
         ....

class Bar(object):
     def __init__(self):
         ....

class Baz(object):
     def __init__(self):
         ....

有了这个我的程序可以做到这一点:

import NameSpace
a = NameSpace.Foo()
b = NameSpace.Bar()

现在,这些 class 变得越来越复杂,而且 Foo 和 Bar 在功能上有所不同,尽管它们在概念性命名空间中相关,所以我想将它们移动到命名空间中的单独文件中,否则我的代码库将保留在相同的。

所以,我想我想要这样的文件结构:

lib/NameSpace
lib/NameSpace/__init__.py
lib/NameSpace/Foo.py
lib/NameSpace/Bar.py
lib/NameSpace/Baz.py

但这需要我更改所有运行时代码来初始化它们:

import NameSpace.Foo
a = NameSpace.Foo.Foo() 

# ***Boo.****   Why u not like 'a = NameSpace.Foo()'?

那么,我要如何构建这些东西才能不必将 'Foo' class 名称添加到模块 'Foo'?我 可以 通过将 init.py 编辑为工厂来完成此操作,如下所示:

#lib/NameSpace/__init__.py

import NameSpace.Foo as NSF

def Foo(*args, **kwargs):
    return(NSF.Foo(*args,**kwargs))

但这似乎比我预期的 Python 更不优雅。有更好的方法吗?

在你的__init__.py

from .Foo import Foo
from .Bar import Bar
from .Baz import Baz

将文件命名为不同于您的 类 可防止覆盖。

为简单起见,您可以像这样从模块中导入 Foo class:

from NameSpace.Foo import Foo

之后,您可以像这样创建 Foo class 的对象:

a = Foo()

如果愿意,您也可以在导入时提供不同的名称:

from NameSpace.Foo import Foo as F
a = F()