用于参数化继承的元类

2023-11-24

我读过一些关于 Python 元类的教程。我以前从未使用过,但我需要一个来完成相对简单的事情,并且所有教程似乎都面向更复杂的用例。我基本上想创建一个具有一些预先指定的主体的模板类,但将其基类作为参数。由于我从 C++/D 模板中得到了这个想法,下面是我想要编写的代码在 C++ 中的示例:

template<class T>
    class Foo : T {
        void fun() {}
    }

虽然这当然可以使用元类来完成,但您可以在没有元类的情况下做您想做的事情,因为在 Python 中,类本身就是对象。令人惊讶的是,这意味着本质上只需要对 C++ 代码进行几乎一对一的翻译。除了因此相对简单之外,它也无需修改即可在 Python 2 和 3 中运行。

def template(class_T):
    """Factory function to create subclasses of class_T."""

    class Foo(class_T):
        def fun(self):
            print('%s.fun()' % self.__class__.__name__)

    Foo.__name__ += '_' + class_T.__name__  # rename the subclass to reflect its heritage
    return Foo

class Base1:
    def bar(self):
        print('Base1.bar()')

class Base2:
    def bar(self):
        print('Base2.bar()')

Foo_Base1 = template(Base1)
print('Foo_Base1 base classes: {}'.format(Foo_Base1.__bases__))

Foo_Base2 = template(Base2)
print('Foo_Base2 base classes: {}'.format(Foo_Base2.__bases__))

subclass1 = Foo_Base1()
subclass1.fun()
subclass1.bar()
subclass2 = Foo_Base2()
subclass2.fun()
subclass2.bar()

Output:

Foo_Base1 base classes: (<class __main__.Base1 at 0x00A79C38>,)
Foo_Base2 base classes: (<class __main__.Base2 at 0x00A79DC0>,)
Foo_Base1.fun()
Base1.bar()
Foo_Base2.fun()
Base2.bar()

中的代码(名称缺乏想象力)template()函数是通常所说的函数的一个例子类工厂或实施工厂模式。所以,顺便说一句,你可能会发现我的答案对这个问题到底什么是类工厂?内容丰富。

Edit:添加了代码来为返回的每个子类创建不同的类名 - 灵感来自 @阿罗斯特林的见解(在现已删除的评论中)关于调试时如果制造的类始终具有相同名称的潜在混乱。

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

用于参数化继承的元类 的相关文章

  • Spark 和 Python 使用自定义文件格式/生成器作为 RDD 的输入

    我想问一下 Spark 中输入的可能性 我可以看到从http spark apache org docs latest programming guide html http spark apache org docs latest pro
  • 查找 Pandas DF 行中的最短日期并创建新列

    我有一个包含多个日期的表 有些日期将为 NaN 我需要找到最旧的日期 所以一行可能有 DATE MODIFIED WITHDRAWN DATE SOLD DATE STATUS DATE 等 因此 对于每一行 一个或多个字段中都会有一个日期
  • pandas 相当于 np.where

    np where具有向量化 if else 的语义 类似于 Apache Spark 的when otherwise数据帧方法 我知道我可以使用np where on pandas Series but pandas通常定义自己的 API
  • Ubuntu systemd 自定义服务因 python 脚本而失败

    希望获得有关 Ubuntu 中的 systemd 守护进程服务的一些帮助 我写了一个 python 脚本来禁用 Dell XPS 上的触摸屏 这更像是一个问题 而不是一个有用的功能 该脚本可以工作 但我不想一直启动它 这就是为什么我想到编写
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • Airflow 1.9 - 无法将日志写入 s3

    我在 aws 的 kubernetes 中运行气流 1 9 我希望将日志发送到 s3 因为气流容器本身的寿命并不长 我已经阅读了描述该过程的各种线程和文档 但我仍然无法让它工作 首先是一个测试 向我证明 s3 配置和权限是有效的 这是在我们
  • 在Raspberry pi上升级skimage版本

    我已经使用 Raspberry Pi 2 上的 synaptic 包管理器安装了 python 包 然而 skimage 模块版本 0 6 是 synaptic 中最新的可用版本 有人可以指导我如何将其升级到0 11 因为旧版本中缺少某些功
  • 可以使用哪些技术来衡量 pandas/numpy 解决方案的性能

    Question 如何简洁全面地衡量下面各个功能的性能 Example 考虑数据框df df pd DataFrame Group list QLCKPXNLNTIXAWYMWACA Value 29 52 71 51 45 76 68 6
  • 如何指示 urwid 列表框的项目数多于当前显示的项目数?

    有没有办法向用户显示 urwid 列表框在显示部分上方 下方有其他项目 我正在考虑类似滚动条的东西 它可以显示条目的数量 或者列表框顶部 底部的单独栏 如果这个行为无法实现 有哪些方法可以实现这个通知 在我的研究过程中 我发现这个问题 ht
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • AWS Lambda 不读取环境变量

    我正在编写一个 python 脚本来查询 Qualys API 中的漏洞元数据 我在 AWS 中将其作为 lambda 函数执行 我已经在控制台中设置了环境变量 但是当我执行函数时 出现以下错误 module initialization
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 将 Keras 集成到 SKLearn 管道?

    我有一个 sklearn 管道 对异构数据类型 布尔 分类 数字 文本 执行特征工程 并想尝试使用神经网络作为我的学习算法来拟合模型 我遇到了输入数据形状的一些问题 我想知道我想做的事情是否可能 或者我是否应该尝试不同的方法 我尝试了几种不
  • IndexError - 具有匀称形状的笛卡尔 PolygonPatch

    我曾经使用 shapely 制作一个圆圈并将其绘制在之前填充的图上 这曾经工作得很好 最近 我收到索引错误 我将代码分解为最简单的操作 但它甚至无法执行最简单的循环 import descartes import shapely geome
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调
  • python从二进制文件中读取16字节长的双精度值

    我找到了蟒蛇struct unpack 读取其他程序生成的二进制数据非常方便 问题 如何阅读16 字节长双精度数出二进制文件 以下 C 代码将 1 01 写入二进制文件三次 分别使用 4 字节浮点型 8 字节双精度型和 16 字节长双精度型

随机推荐

  • PDO PHP bindValue 不起作用

    我知道这个问题已经被问了 1000 次了 但出于某种原因 我继续用头撞墙 这有效 sql SELECT a eventCode a eventTime a teamCode a playerCode b lastName b firstNa
  • 将 ImageView 中的图像保存到设备图库

    我正在尝试将图像从 ImageView 保存到设备库 我试过这段代码 代码编辑 URL url new URL getIntent getStringExtra imageURL File f new File url getPath ad
  • 为什么第二个 for 循环总是比第一个循环执行得快?

    我试图弄清楚 for 循环是否比 foreach 循环更快 并使用 System Diagnostics 类来计时任务 在运行测试时 我注意到我放在第一个循环的执行速度总是比最后一个循环慢 有人可以告诉我为什么会发生这种情况吗 我的代码如下
  • 我的 javascript 文件中的 Laravel 4 Blade 语法

    我的主页有一些内联 javascript 与一些刀片语法混合在一起 例如 它一直有效 直到我想将 javascript 移动到外部 file js 每当添加刀片语法时我都会出错 有没有办法可以在我的 javascript files js
  • 为什么在推导类型时会删除模板参数的限定符?

    在使用 Microsoft VisualStudio 2008 构建一个小示例程序时 我注意到传递给模板的类型推导有一个奇怪的事情 考虑这个例子 template
  • 在 C 中, (x==y==z) 的行为是否符合我的预期?

    我可以比较如下三个变量 而不是这样做if x y y z z x 如果所有三个变量具有相同的值 则应执行 if 语句 这些是布尔值 if debounceATnow debounceATlast debounceATlastlast deb
  • 在 Swing 中的组件顶部进行绘制?

    我有一个JPanel添加到JViewport 并且该面板还添加了几个其他面板 我正在尝试实现一种拖动选择 您可以通过拖动鼠标来选择多个组件 我面临的唯一问题是选择矩形被绘制在添加到主组件的组件后面JPanel 我怎样才能在它们上面画画 我的
  • Powershell 彩色目录列表在格式范围内不正确

    我从这里得到了这个彩色目录脚本http tasteofpowershell blogspot com 2009 02 get childitem dir results color coded html function ls regex
  • JPA 和 JSON 运算符本机查询

    我试图让这个查询在 JPA 中工作 SELECT FROM contrat WHERE contrat json gt nom hever 它完美地与postgresql但是当我将它与JPA集成时 出现以下错误 该位置 1 的参数不存在 M
  • 给定 N 个生成器,是否可以创建一个在并行进程中运行它们并生成这些生成器的 zip 的生成器?

    假设我有 N 个生成器gen 1 gen N其中每个都会产生相同数量的值 我想要一台发电机gen这样它就可以在 N 个并行进程中运行 gen 1 gen N 并产生 next gen 1 next gen 2 next gen N 这就是我
  • 静态 HttpClient 仍在创建 TIME_WAIT tcp 端口

    我在 NET Framework 4 5 1 4 6 1 和 4 7 2 中的 HttpClient 中遇到了一些有趣的行为 由于 TCP 端口使用率高的已知问题 我建议在工作中的项目中进行一些更改 以便在每次使用时不处理 HttpClie
  • C++ 异常:抛出 std::string

    当我的 C 方法遇到奇怪的事情并且无法恢复时 我想抛出异常 可以扔一个吗std string指针 这就是我期待做的事情 void Foo Bar if QueryPerformanceTimer m baz throw new std st
  • 投影球体的半径

    我想完善一个上一个问题 如何将球体投影到屏幕上 2 给出了一个简单的解决方案 approximate radius on screen CLIP SPACE world radius cot fov 2 Z with fov field o
  • 相对于容器以百分比宽度定位固定元素

    我知道position fixed使元素相对于视口而不是它的offsetParent但是我有一个问题 我有一个侧面元素需要x空间量 然后是一些固定位置标题元素 我想占用剩余视口宽度的一定百分比 参见小提琴 http jsfiddle net
  • 如何防止自动 AJAX 攻击

    如何防止用户自动发帖 垃圾邮件 Here is my way这样做时 每个页面请求都会有新的 php 会话 这有其自身的局限性 没有多选项卡 我为每个页面使用了新会话来防御 CSRF 和自动攻击 假设我们有一个使用 AJAX 发布线程的论坛
  • 使用 JavaScript 检测对 Iframe 的点击

    我知道不可能知道用户在内部做什么iframe如果是跨域的话 我想做的是跟踪用户是否点击了iframe 我想象一个场景 有一个看不见的东西div在上面iframe以及div然后将点击事件传递给iframe 这样的事情可能吗 如果是的话 我该怎
  • NET Standard 与 Net Core App:创建 .NET Core 项目时(使用控制台或类库)

    I am trying to develop my projects to be cross platform I have created several class libraries in this way 但是 当我使用实体框架构建
  • HDFS 文件比较

    我如何比较两个 HDFS 文件 因为没有diff 我正在考虑使用 Hive 表并从 HDFS 加载数据 然后在 2 个表上使用 join 语句 有没有更好的方法 没有diffhadoop 提供的命令 但实际上您可以在 shell 中使用重定
  • FREETEXTTABLE 的排名始终为 0

    我正在使用 SQLServer 2008 如果我执行以下查询 SELECT FROM FREETEXTTABLE SomeTable Name a name that I know exists 我得到了我期望的行 但排名始终为 0 寻找这
  • 用于参数化继承的元类

    我读过一些关于 Python 元类的教程 我以前从未使用过 但我需要一个来完成相对简单的事情 并且所有教程似乎都面向更复杂的用例 我基本上想创建一个具有一些预先指定的主体的模板类 但将其基类作为参数 由于我从 C D 模板中得到了这个想法