如何设置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()
我一直在寻找这个,但找不到任何东西。我是一名经验丰富的程序员,但最近切换到 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()