如何重定向Python中包含的类的所有方法?

2024-05-04

如何实现组合模式?我有课Container它有一个属性对象Contained。我想重定向/允许访问所有方法Contained班级来自Container只需调用my_container.some_contained_method()。我是否以正确的方式做正确的事?

我用类似的东西:

class Container:
   def __init__(self):
       self.contained = Contained()
   def __getattr__(self, item):
       if item in self.__dict__: # some overridden
           return self.__dict__[item] 
       else:
           return self.contained.__getattr__(item) # redirection

背景:

我正在尝试建立一个班级(Indicator)添加到现有类的功能(pandas.DataFrame). Indicator将会有所有的方法DataFrame。我可以用遗产,但我遵循“青睐”作品 over 遗产“建议(例如,参见以下答案:python:继承或组合 https://stackoverflow.com/questions/2389816/python-inheriting-or-composition)。不继承的原因之一是因为基类不可序列化,而我需要序列化。

我已经发现this http://yauhen.yakimovich.info/blog/tag/composition/,但我不确定它是否符合我的需求。


Caveats:

  • DataFrame 有很多属性。如果一个DataFrame属性是一个数字,您可能只想返回该数字。但如果DataFrame属性是DataFrame你可能想返回一个Container。如果DataFrame属性是一个Series或描述符?实施Container.__getattr__正确地说,你真的 必须编写单元测试对于每个属性.
  • 还需要进行单元测试__getitem__.
  • 您还必须定义和单元测试__setattr__ and __setitem__, __iter__, __len__, etc.
  • Pickling 是序列化的一种形式,所以如果DataFrames是可腌制的,我不知道如何腌制Container这对序列化确实有帮助。

一些评论:

  • __getattr__仅当属性不在时才被调用self.__dict__。所以你不需要if item in self.__dict__在你的__getattr__.

  • self.contained.__getattr__(item) calls self.contained's __getattr__直接方法。这通常不是你想要的 这样做,因为它绕过了整个 Python 属性查找 机制。例如,它忽略了属性的可能性 可能在self.contained.__dict__,或在__dict__其中之一的 的基础self.contained.__class__ or if item指的是 描述符。而是使用getattr(self.contained, item).


import pandas
import numpy as np

def tocontainer(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return Container(result)
    return wrapper

class Container(object):
   def __init__(self, df):
       self.contained = df
   def __getitem__(self, item):
       result = self.contained[item]
       if isinstance(result, type(self.contained)):
           result = Container(result)
       return result
   def __getattr__(self, item):
       result = getattr(self.contained, item)
       if callable(result):
           result = tocontainer(result)
       return result
   def __repr__(self):
       return repr(self.contained)

这是一些随机代码来测试是否——至少表面上——Container代表DataFrame正确并返回Containers:

df = pandas.DataFrame(
    [(1, 2), (1, 3), (1, 4), (2, 1),(2,2,)], columns=['col1', 'col2'])
df = Container(df)
df['col1'][3] = 0
print(df)
#    col1  col2
# 0     1     2
# 1     1     3
# 2     1     4
# 3     2     1
# 4     2     2
gp = df.groupby('col1').aggregate(np.count_nonzero)
print(gp)
#       col2
# col1      
# 1        3
# 2        2
print(type(gp))
# <class '__main__.Container'>

print(type(gp[gp.col2 > 2]))
# <class '__main__.Container'>

tf = gp[gp.col2 > 2].reset_index()
print(type(tf))
# <class '__main__.Container'>

result = df[df.col1 == tf.col1]
print(type(result))
# <class '__main__.Container'>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何重定向Python中包含的类的所有方法? 的相关文章

  • 使用特定的类/函数预加载 Jupyter Notebook

    我想预加载一个笔记本 其中包含我在另一个文件中定义的特定类 函数 更具体地说 我想用 python 来做到这一点 比如加载一个配置文件 包含所有相关的类 函数 目前 我正在使用 python 生成笔记本并在服务器上自动启动它们 因为不同的
  • Python 中的哈希映射

    我想用Python实现HashMap 我想请求用户输入 根据他的输入 我从 HashMap 中检索一些信息 如果用户输入HashMap的某个键 我想检索相应的值 如何在 Python 中实现此功能 HashMap
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 处理 Python 行为测试框架中的异常

    我一直在考虑从鼻子转向行为测试 摩卡 柴等已经宠坏了我 到目前为止一切都很好 但除了以下之外 我似乎无法找出任何测试异常的方法 then It throws a KeyError exception def step impl contex
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • Pandas 日期时间格式

    是否可以用零后缀表示 pd to datetime 似乎零被删除了 print pd to datetime 2000 07 26 14 21 00 00000 format Y m d H M S f 结果是 2000 07 26 14
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • datetime.datetime.now() 返回旧值

    我正在通过匹配日期查找 python 中的数据存储条目 我想要的是每天选择 今天 的条目 但由于某种原因 当我将代码上传到 gae 服务器时 它只能工作一天 第二天它仍然返回相同的值 例如当我上传代码并在 07 01 2014 执行它时 它
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • 如何在 Python 中解析和比较 ISO 8601 持续时间? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Python v2 库 它允许我解析和比较 ISO 8601 持续时间may处于不同单
  • Python,将函数的输出重定向到文件中

    我正在尝试将函数的输出存储到Python中的文件中 我想做的是这样的 def test print This is a Test file open Log a file write test file close 但是当我这样做时 我收到
  • 如何在不丢失注释和格式的情况下更新 YAML 文件 / Python 中的 YAML 自动重构

    我想在 Python 中更新 YAML 文件值 而不丢失 Python 中的格式和注释 例如我想改造 YAML 文件 value 456 nice value to value 6 nice value 界面类似于 y yaml load
  • 如何使用 pybrain 黑盒优化训练神经网络来处理监督数据集?

    我玩了一下 pybrain 了解如何生成具有自定义架构的神经网络 并使用反向传播算法将它们训练为监督数据集 然而 我对优化算法以及任务 学习代理和环境的概念感到困惑 例如 我将如何实现一个神经网络 例如 1 以使用 pybrain 遗传算法
  • Jupyter Notebook 找不到 Python 模块

    不知道发生了什么 但每当我使用 ipython 氢 原子 或 jupyter 笔记本时都找不到任何已安装的模块 我知道我安装了 pandas 但笔记本说找不到 我应该补充一点 当我正常运行脚本时 python script py 它确实导入
  • Pandas 将多行列数据帧转换为单行多列数据帧

    我的数据框如下 code df Car measurements Before After amb temp 30 268212 26 627491 engine temp 41 812730 39 254255 engine eff 15
  • 实现 XGboost 自定义目标函数

    我正在尝试使用 XGboost 实现自定义目标函数 在 R 中 但我也使用 python 所以有关 python 的任何反馈也很好 我创建了一个返回梯度和粗麻布的函数 它工作正常 但是当我尝试运行 xgb train 时它不起作用 然后 我
  • 将 Python 中的日期与日期时间进行比较

    所以我有一个日期列表 datetime date 2013 7 9 datetime date 2013 7 12 datetime date 2013 7 15 datetime date 2013 7 18 datetime date
  • 在 JavaScript 函数的 Django 模板中转义字符串参数

    我有一个 JavaScript 函数 它返回一组对象 return Func id name 例如 我在传递包含引号的字符串时遇到问题 Dr Seuss ABC BOOk 是无效语法 I tried name safe 但无济于事 有什么解
  • 使用 z = f(x, y) 形式的 B 样条方法来拟合 z = f(x)

    作为一个潜在的解决方案这个问题 https stackoverflow com questions 76476327 how to avoid creating many binary switching variables in gekk
  • Kivy - 单击按钮时编辑标签

    我希望 Button1 在单击时编辑标签 etykietka 但我不知道如何操作 你有什么想法吗 class Zastepstwa App def build self lista WebOps getList layout BoxLayo

随机推荐

  • 特定字段的自定义 Jackson 序列化器

    我希望为同一对象提供多个杰克逊反序列化器 所有这些都基于自定义注释 理想情况下 我有一个 POJO 例如 public class UserInfo Redacted String ssn String name 在 正常 条件下 我希望该
  • Chrome 21 不检查单选按钮

    我经过一番努力才发现这一点 所以我想我应该分享我所遇到的事情 这样其他人就可以从我的努力中受益 Firefox IE 和 chrome 19 我手边唯一的其他版本 没有这个问题 但 chrome 21 有 如果您有这个单选按钮
  • 未捕获的类型错误:提供您的根 Epic 来 createEpicMiddleware(rootEpic)

    我收到这个错误 未捕获的类型错误 将您的根 Epic 提供给createEpicMiddleware rootEpic 不再支持 而是使用epicMiddleware run rootEpic 简单使用时 import rxjs impor
  • SwiftUI withAnimation 完成回调

    我有一个基于某种状态的 swiftUI 动画 withAnimation linear duration 0 1 self someState newState 上述动画完成时是否会触发任何回调 如果有关于如何在 SwiftUI 中使用完成
  • 如何在 C++ 中重载数组的运算符<<?

    我正在尝试这样做 template
  • 多个构建配置可以共享一个配置转换吗?

    我正在使用 SlowCheetah 进行 XML 转换项目中的一堆配置文件 但是 这个相同的解决方案是负载平衡设置的一部分 其中不同服务器 在本例中为两个 之间的某些配置值有所不同 我有以下构建配置 Debug Release 发布 测试
  • 如何永久清除 linux/ubuntu 终端或 bash 中的所有历史记录? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 当您在 Linux 终端中使用向上键时 可以再次使用之前的命令 很棒的功能 但是 我开始使用命令中的敏感详细信息将 mysql 记录到 mysql 中
  • 使用 Admin SDK 将文件上传到 Firebase 存储

    根据Docs https cloud google com storage docs uploading objects storage upload object nodejs 我必须将文件名传递给函数才能上传文件 Uploads a l
  • 在达到 API 配额限制之前 YouTube 视频上传被拒绝

    我的项目的API配额通过申请过程成功增加到4M 通过以下方式在配额详细信息中确认了这一点 谷歌开发者控制台 https console developers google com已启用 API 的配额页面 然而 在标准的 50 次上传后 视
  • 使用 NDB 中的 Key 检索实体

    我有这样的结构 有章节的书籍 祖先 书 有页面 祖先 章节 我很清楚 要通过 ID 搜索章节 我需要通过祖先查询来搜索书籍 今天我了解到 如果我拥有所有密钥 我可以直接检索实体 而无需先获取书籍 然后获取章节 然后获取页面 如下所示 pag
  • 读取目标设备上 UIAutomation 的 UIAApplication.setPreferencesValueForKey() 设置的首选项?

    在过去的几天里 我一直在使用 Apple 的 UIAutomation 框架 试图组合一套验收测试来推动我正在开发的应用程序的开发 以 BDD 类型的方式 我遇到的一件事是如何让 SUT 进入给定状态 以便在我需要设置一些内部状态时可以开始
  • Eclipse CTRL+A、CTRL+E 转到行首 转到行尾

    I searched and was very surprised that I can t find a possibility to make CTRL A CTRL E work So I can jump to the beginn
  • 设置使用 pandas 绘图方法创建的图表上的 x 轴格式

    pandas DataFrame plot 是一种从数据帧绘制数据的便捷方法 但是 我不明白如何使用此方法格式化轴 例如 import pandas as pd import datetime df pd DataFrame index d
  • Web 服务代码不返回字符串数组

    我想从我的 Web 服务方法返回 abc xyz ghi tru 其中 是分隔符 形式的字符串数组 但是我做不到 这是我当前的网络服务代码 using System using System Collections using System
  • 在 Hyperledger Composer 中包含外部库文件

    有没有办法在 Hyperledger Composer 中包含外部库 我想用这个图书馆 http numeraljs com 用于货币计算 我在这看到post https stackoverflow com questions 446888
  • 使用 Caret 包的测试集的 ROC 曲线

    我正在尝试从测试集上的插入符号中获取最佳模型的 ROC 曲线 我碰到MLeval包似乎很方便 输出非常全面 使用几行代码提供了所有需要的指标和图表 一个很好的例子在这里 https stackoverflow com a 59134729
  • LogCat 不显示标签“SMS”

    Override public void onCreate Bundle savedInstanceState super onCreate savedInstanceState setContentView R layout main L
  • 如何防止在 CSS 中调整图像大小?

    我有以下代码来创建图像库 他们需要做出反应 但问题是 当窗口宽度发生变化时 图像也会调整大小并失去纵横比 我怎样才能解决这个问题 我是 CSS 新手 padding 0 margin 0 HEADER STYLES header width
  • 垂直和水平平行度

    最近在并行领域工作 我了解到有两个术语 垂直并行 和 水平并行 有人说openmp 共享内存并行 是垂直并行 而mpi 分布式内存并行 是水平并行 为什么这些术语这么称呼 我不明白原因 这么称呼它们只是术语吗 这些术语似乎没有被广泛使用 也
  • 如何重定向Python中包含的类的所有方法?

    如何实现组合模式 我有课Container它有一个属性对象Contained 我想重定向 允许访问所有方法Contained班级来自Container只需调用my container some contained method 我是否以正确