”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在 Python 模块中模仿类行为?

如何在 Python 模块中模仿类行为?

发布于2024-11-16
浏览:239

How Can You Mimic Class-Like Behavior in Python Modules?

使用 getattr

在模块中动态实现类类行为 在某些情况下,可能需要模仿__getattr__ 对类的行为,但对整个模块的行为。这允许动态创建类实例并根据模块上的属性查找调用其方法。

但是,尝试直接在模块上定义 __getattr__ 方法面临两个障碍:

  • Python只检查类上的此类方法。
  • 修改底层模块类型(module)以允许属性设置是不可行的

基于包装器的解决方案

一种方法是围绕模块创建包装器。 Sys.modules 能够容忍不同的对象类型,因此我们可以将模块包装在一个类中并将其分配给 sys.modules[__name__]。这允许动态行为而无需修改模块本身。然而,这种技术仅适用于模块级访问。

Guido van Rossum's Hack

Guido van Rossum 建议的另一个解决方案涉及替换 sys.path 中的实际模块。具有模块内定义的类实例的模块。导入机制执行最后的替换步骤,从而实现此黑客攻击。以下示例演示了这种方法:

# module foo.py

import sys

class Foo:
    def funct1(self, *args):
        
    def funct2(self, *args):
        

sys.modules[__name__] = Foo()

现在,可以通过 Foo 的实例访问模块中定义的函数。

注意事项

使用这些技术时,在 sys.modules 分配后可能无法访问其他模块元素。在替换类中定义所有必需的功能,以避免丢失模块内容。

__all__ 属性

使用 from module import * 时,在替换类中定义 __all__ 来处理此问题导入声明的类型。省略 __all__ 中的 __module__ 和 __qualname__ 等属性。

最新教程 更多>
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-16
  • 为什么 C/C++ 中 `size_t` 是无符号的:历史的必然还是现代的 bug 磁石?
    为什么 C/C++ 中 `size_t` 是无符号的:历史的必然还是现代的 bug 磁石?
    为什么 size_t 无符号?Bjarne Stroustrup 的观察结果是“使用无符号而不是 int 来多获得一位来表示正整数几乎从来都不是一个好主意”引起了人们对将 size_t 设为无符号的决定的担忧。历史起源最初,size_t 是无符号的,以适应具有 16 位指针的体系结构,例如 DOS ...
    编程 发布于2024-11-16
  • 如何使用 Selenium Python 从 Shadow Root 中提取信息?
    如何使用 Selenium Python 从 Shadow Root 中提取信息?
    如何使用 Selenium 从影子根中提取信息 PythonSelenium 为 Web 自动化提供了一个强大的框架,包括提取信息的能力来自动态加载的 Web 元素(例如影子根)的信息。本指南将演示如何克服从影子根中的特定在线商店提取产品标签和其他字段的挑战。挑战:从影子根中提取信息 当遇到影子根时...
    编程 发布于2024-11-16
  • 如何使用特定字段中的值数组从 MySQL 表中选择数据?
    如何使用特定字段中的值数组从 MySQL 表中选择数据?
    从 MySQL 表中选择特定字段中包含值的数组在使用 MySQL 数据库时,您可能会遇到需要的场景根据存储在数组中的值检索数据。例如,假设您有一个名为 $array 的数组,其中包含用户 ID 列表:$array = array(1, 40, 20, 55, 29, 48);To选择 myField...
    编程 发布于2024-11-16
  • 在 HTML 中添加 Javascript 文件的最佳方法
    在 HTML 中添加 Javascript 文件的最佳方法
    在 HTML 中,有多种方法可以包含 JavaScript 文件。我将解释四种不同的方法及其缺点,最后强调最佳方法。 1.中的 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8...
    编程 发布于2024-11-16
  • 为什么我的 Bootstrap 4 列是垂直对齐而不是水平对齐?
    为什么我的 Bootstrap 4 列是垂直对齐而不是水平对齐?
    Bootstrap 4 列对齐不一致在从 Bootstrap 3 到 4 的过渡中,您注意到您的列是垂直对齐的,而不是水平地。这可以归因于 Bootstrap 4 中网格系统的更改。Col-12 Issue在 Bootstrap 3 中,您可以使用以下方法将列包装在父行中“col-12”类。这在 B...
    编程 发布于2024-11-16
  • 如何在 Python 中确定生成器是否为空
    如何在 Python 中确定生成器是否为空
    确定生成器的空性在Python中,生成器是用于惰性评估和迭代大型数据集的强大工具。然而,由于发电机的动态特性,确定发电机是否为空是一个独特的挑战。与列表或元组不同,生成器没有大小属性​​,简单地迭代它们会导致 StopIteration 异常。Peek 与 HasNext有些人可能会建议使用 pee...
    编程 发布于2024-11-16
  • 如何基于公共列合并多个 DataFrame 并保留共享行?
    如何基于公共列合并多个 DataFrame 并保留共享行?
    基于公共列合并多个数据帧您有多个具有公共列“日期”的数据帧,并且需要合并它们同时保留所有数据帧共有日期的行。递归函数方法可能很复杂并且容易出错。这是使用 pandas 强大的分组和合并功能的更简单的解决方案:import pandas as pd # Create a list of datafra...
    编程 发布于2024-11-16
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-16
  • 为什么 PHP 中的特殊字符会显示为带问号的黑钻石?
    为什么 PHP 中的特殊字符会显示为带问号的黑钻石?
    PHP字符编码问题:带有问号的小黑钻石用户在使用PHP从数据库中检索数据时经常遇到一个特殊问题:特殊字符(例如引号)显示为带有问号 (�) 的黑色菱形。此问题是由于数据的编码与用于显示它的编码之间的差异引起的。要解决此问题,您可以实现多种方法:HTTP 标头: 添加 HTTP 标头,为浏览器指定正确...
    编程 发布于2024-11-16
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-16
  • CURL 可以替代 file_get_contents 来获取外部链接吗?
    CURL 可以替代 file_get_contents 来获取外部链接吗?
    使用 CURL 获取外部链接(替代 file_get_contents)为了获取特定页面上的外部链接,通常使用 file_get_contents 函数。但是,当您使用的服务器不支持此功能时,CURL 可以作为一个可行的替代方案。要实现 CURL,您可以使用以下代码:function file_ge...
    编程 发布于2024-11-16
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-16
  • Go的FileMode函数如何处理八进制和十进制权限转换?
    Go的FileMode函数如何处理八进制和十进制权限转换?
    Go 中 FileMode 函数的权限解析os.FileMode 函数在设置标志之前转换各种格式的权限。这些格式包括整数、八进制表示形式以及可能的其他形式。从整数转换为 os.FileMode 时,该函数不会显式辨别整数是用八进制还是十进制表示。十进制表示形式被解释为常规整数。数字的八进制表示形式通...
    编程 发布于2024-11-16
  • ## 如何在 Android 上从 FTP 服务器下载文件:哪个 Java 库最好?
    ## 如何在 Android 上从 FTP 服务器下载文件:哪个 Java 库最好?
    适用于 Android 的 FTP 库正在寻找一个可靠的 Java 库,以方便从 Android 设备上的 FTP 服务器下载和恢复文件?让我们深入研究一些潜在的解决方案。Apache Commons FTP考虑一下 Apache Commons FTP,它是一个广泛使用且备受推崇的 FTP 操作库...
    编程 发布于2024-11-16

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3