【发布时间】:2020-02-23 07:41:20
【问题描述】:
我正在尝试将子文件夹中的所有对象导入到 python 3.8 中的一个类中,并且正在努力寻找一种方法来做到这一点。我不想手动导入所有对象,因为要列出的文件太多:
class Foo:
from bar import {
one,
two,
three,
# ...
}
当我使用星号导入所有函数和类时(例如from bar import *),我收到以下错误:
SyntaxError: import * only allowed at module level
另外,我不想把所有东西都放在一个子作用域下(例如import bar.package 并将所有文件放在bar 的package 子包中),因为bar 中的函数依赖于被传递self 运行时意味着必须将 self 的所有引用更改为 self.package 我只是创建另一个文件夹,其中包含类中的所有方法,因此没有一个非常长的文件。
所以我想我有三个问题:为什么不允许在一个类中导入所有内容,我该如何解决这个问题,是否有更好的方法将多个方法拆分到不同的文件中?
编辑:我见过this post,这是我目前拥有的,但我不想手动导入所有内容,而是想使用*。
编辑 2:也许将类的子方法创建为包并将其作为 self 导入会起作用(例如 import bar.package as self),但这可能会覆盖默认的 self。例如说我有两个文件foo.py和bar.py:
# foo.py
def print_bar(self):
print("bar")
# bar.py
class Test:
import foo as self
def __init__(self):
print("hi")
self.one = 1
def print_one(self):
print(self.one)
if __name__ == "__main__":
test_class = Test()
test_class.print_one()
test_class.self.print_bar(test_class)
注意bar.py 中运行test_class.self.print_bar(test_class) 的丑陋调用。在这种情况下,python 不会自动将类作为方法传递。如果我去掉函数中传递的test_class 参数,它不会运行并给出TypeError。我想不惜一切代价避免将self 传递给该方法。
【问题讨论】:
-
为什么你想这样做?为什么不将这些名称放在一个混合类中并导入该类并将其用作导入模块中的基类?
-
这并不是不使用类的真正理由;递归下降解析器设计中没有任何内容要求您避免使用类,然后尝试在事后将方法重新组装到一个类中,从而违背正常的 Python 模式。
-
不过,这与我所说的并不矛盾。然后,您在模块中定义多个类,而不是您希望稍后作为方法附加到类的一堆函数。 :-)
-
啊...我明白你的意思了。是的,我已经这样做了,而不是“丑陋”的全部导入方式。
-
在旁注中,您可能有兴趣阅读Guido van Rossum is re-visiting the Python language parser design。不同的解析器设计,但仍然如此。
标签: python python-3.x class module python-import