将模块内的所有函数和类导入到 python 类中

2024-02-27

我正在尝试将子文件夹中的所有对象导入到 python 3.8 中的类中,并且正在努力寻找一种方法来执行此操作。我不想手动导入所有对象,因为要列出的文件太多:

class Foo:
    from bar import {
        one,
        two,
        three,
        # ...
    }

当我使用星号导入所有函数和类时(例如from bar import *)我收到以下错误:

SyntaxError: import * only allowed at module level

另外,我不想将所有内容都放在子范围内(例如import bar.package并将所有文件放入package的子包bar),因为函数bar依靠被通过self运行时意味着必须更改的所有引用self to self.package我只是用类中的所有方法创建另一个文件夹,这样就不会有一个非常长的文件。

所以我想我有三个问题:为什么不允许在类中导入所有内容,如何解决这个问题,以及是否有更好的方法将多个方法拆分到不同的文件中?

编辑:我见过这个帖子 https://stackoverflow.com/questions/47561840/python-how-can-i-separate-functions-of-class-into-multiple-files/47562412,这是我目前拥有的,但我不想手动导入所有内容,而是想使用*反而。

编辑2:也许将类的子方法创建为包并将其作为 self 导入会起作用(例如import bar.package as self),但这可能会覆盖默认的 self.例如说我有两个文件foo.py and 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 的作用域命名空间,在编译时,需要知道哪些名称被引用为全局名称,并将它们与本地名称区分开来。这在函数中尤其重要,其中通过了解使用的名称来高度优化本地命名空间在编译时。对于类语句,“本地”名称成为类属性。当涉及到动态本地名称时,类语句比函数更灵活,但将任意动态名称列表导入到类定义中从未被视为值得支持的用例。

我该如何解决这个问题

您可以内省模块并获取 Python 将导入的所有相同名称,并使用动态在类上设置这些名称setattr()或者通过分配给locals()字典(类语句是后者实际工作的唯一地方)。这import声明文件 https://docs.python.org/3/reference/simple_stmts.html#import列出导入的内容:

  • 如果模块定义__all__,然后将其用作要导入的名称列表
  • 否则,将导入所有公共名称(名称不以_).

所以以下将达到与使用完全相同的效果from bar import *在类声明中Foo:

import bar

def _import_all(module, class):
    namespace = vars(module)
    public = (name for name in namespace if name[:1] != "_")
    for name in getattr(module, "__all__", public):
        setattr(class, name, namespace[name])

class Foo:
    pass

_import_all(bar, Foo)

或者,这肯定更“hack-y”,并且取决于内部 Python 实现细节:

import bar

class Foo
    locals().update(
        (n, getattr(bar, n))
        for n in getattr(
            bar, "__all__",
            (n for n in dir(bar) if n[:1] != "_")
        )
    )

有没有更好的方法将多个方法拆分到不同的文件中?

是的,使用类。将所有这些方法放在单独的模块中,班级中的每个人,然后只需从每个模块导入这些类并将其用作基类:

import bar, spam

class Foo(bar.Base, spam.Base):
    pass

where bar.py将定义一个Base class:

class Base:
    def print_bar(self):
        print("bar")

也是如此spam等等。您可以根据需要向这些混合基类添加和删除方法,并且import组合基类的语句不会改变。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将模块内的所有函数和类导入到 python 类中 的相关文章

随机推荐

  • UUID 转换为无符号整数

    有没有地方可以将 UUID 压缩 转换 编码 加密为无符号整数 我从 sql 表中读取 UUID 历史记录很难看 我无法更改 我只有一个 unsigned int 来存储它 这是 C 以防产生影响 对此有什么想法吗 谢谢 礼萨 正如其他人所
  • 在两个容器之间共享/tmp

    我在用着docker compose生成两个容器 我想分享 tmp这两个容器之间的目录 但不与主机 tmp如果可能的话 这是因为我正在通过上传一些文件flask to tmp并想要处理这些文件celery flask build comma
  • 撤销 IdentityServer4 中特定会话的访问令牌(参考)

    我在用IdentityServer 4带有参考标记的隐式流程 我自己做了一个实现IPersistedGrantStore https github com IdentityServer IdentityServer4 blob releas
  • SVG使用element来克隆SVG

    是否可以在单独的 svg 中 使用 整个其他 svg 我想使用 d3 生成的地图作为同一页面上的图标 这是我尝试过的 但它不起作用
  • Angualr2 错误:无法设置仅具有 getter 的 # 的属性值

    表格看起来像
  • IntelliJ + JUnit 5(木星)

    My build gradle has testCompile org junit jupiter junit jupiter api 5 0 0 使用标准示例http junit org junit5 docs current user
  • XmlSerializer 和 IEnumerable:可以进行序列化,无需无参数构造函数:Bug?

    在我们的项目中 我们广泛使用 XmlSerializer 偶然我发现了一个没有无参数构造函数的类 我认为这一定会破坏序列化过程 但事实并非如此 通过调查这个问题 我发现 XmlSerializer 在序列化 反序列化时表现得很奇怪IE可枚举
  • 在 git 中为每个部署构建创建一个标签是一个好习惯吗?

    我刚刚从 Subversion 切换到 Git Subversion 的集中式架构为其提供了一个有意义的修订号 我将其构建到基于 Web 的应用程序的更改日志中 以便轻松登录并查看任何给定服务器上正在运行的版本 Git 没有友好的内部版本号
  • 如何使用 REST API 为领事附加手表?

    我使用 REST API 来访问领事 例如 这是我创建条目的方法 curl X PUT d localhost 8500 v1 kv example lt lt lt FooValue 我想添加watches当键值更改时通知我的服务的领事
  • 将函数发布到门户后,Azure 函数在函数列表中不可见

    我是Azure函数的新手 在函数发布到门户后发现这里 但它在函数列表中不可见 我附上了示例代码的快照和一个空的天蓝色列表 请帮忙 添加kudu ui 这里我找到了 wwwroot下唯一的host json Hi All 添加了kudu ui
  • 如何定义 Airflow 上 STFP Operator 的操作?

    class SFTPOperation object PUT put GET get operation SFTPOperation GET NameError name SFTPOperation is not defined 我在这里定
  • 维吉尼亚密码解密

    我正在尝试使用维吉尼亚密码进行加密和解密 这是一项更大任务的一部分 而维吉尼亚密码只扮演了一小部分 我从 bash 得到了这个加密脚本 可以正常工作 问题是我如何反向使用相同的代码来解密代码 usr local bin bash vigen
  • Java / Android 编程 - 循环失败

    我正在使用带有计时器的 while 循环 问题是计时器并不是在每个循环中都使用 仅在第一次使用 第一次之后 循环内包含的语句将在没有我设置的延迟的情况下执行 既然计时器包含在 while 循环内 这怎么可能呢 有什么解决办法吗 int co
  • 如何在 HTML 中将文本和图像并排放置?

    我希望文本和图像彼此相邻 但我希望图像位于屏幕的最左侧 而我希望文本位于屏幕的最右侧 这就是我目前所拥有的 img src website art png height 75 width 235 h3 font face Verdana T
  • 如何确定 Django 模型中的类实例是否是另一个模型的子类?

    我有一堂课叫BankAccount作为基类 我也有CheckingAccount and SavingsAccount继承自的类BankAccount BankAccount 不是一个抽象类 但我不从中创建对象 只创建继承类 然后 我执行如
  • 我不知道为什么这个画布是空的

    因此 我一直在研究如何用其他图像填充画布的几个示例 一旦我稍微重新排列代码 它们就会停止工作 我注意到画布上的一些行为与其他类型的 JavaScript 变量相比没有意义 我想知道发生了什么 例如 如果我做这样的事情
  • 在python中读取标头之间的文件

    我有一个大文本文件 其中的值由以 开头的标题分隔 如果条件与标头中的条件匹配 我想读取文件直到下一个标头 并跳过文件的其余部分 为了测试我正在尝试读取以下名为 test234 txt 的文本文件 abcdefgh 1fnrnf mrkfr
  • 我可以在 Play Framework 上的模板/视图中调用会话吗

    我是 Play Framework 2 0 的新手 我使用的是 Scala 并且有一个关于会话的问题 我有 Ruby on Rails 背景 因此我倾向于将在 Play Framework 中学到的所有内容都与 Ruby on Rails
  • 新的 Facebook API 3.0。和 ActionBarSherlock 兼容性

    我正在阅读 facebook Android API 3 0 文档 我不明白会话与后台活动有什么关系 在所有示例中 我都应该扩展 FacebookFragment 好吧 如果我的整个应用程序不扩展 SherlockFragment 那就太好
  • 将模块内的所有函数和类导入到 python 类中

    我正在尝试将子文件夹中的所有对象导入到 python 3 8 中的类中 并且正在努力寻找一种方法来执行此操作 我不想手动导入所有对象 因为要列出的文件太多 class Foo from bar import one two three 当我