gpt4 book ai didi

python - 在 python 中创建包装类时,如何让父类(super class)的方法返回包装类的实例

转载 作者:行者123 更新时间:2023-12-01 05:20:24 32 4
gpt4 key购买 nike

例如,如果我围绕 pandas 数据框创建一个简单的包装器:

    from pandas import DataFrame

class MyDataFrame(DataFrame):

def __init__(self,data):

DataFrame.__init__(self,data)

@staticmethod
def add(a, b):
return a + b

然后我实例化它..

    x = MyDataFrame([1,2,3])

x.add(1,2)
# => 3

type(x)
# => __main__.MyDataFrame

它有效。但是,如果我在其上调用返回数据帧的数据帧方法,它就不是我的包装类的实例。

    y = x.reindex([3,4,5])
type(y)
# => pandas.core.frame.DataFrame

如何让它为所有 DataFrame 方法返回 MyDataFrame 的实例?这是一个常见问题吗?我是否以错误的方式处理这个问题?

最佳答案

您显示的示例不是包装器,而是 Python 中的子类。现在,您的情况下的 python 子类和方法解析按照简单的规则运行

  1. 查看方法接收者对象的类型
  2. 检查类的类层次结构并找到定义该方法的第一个实例。然后查看该方法的签名并相应地执行它。在您的情况下,类层次结构是简单的子类-父类(super class)。

所以,就你而言,

  1. x 被定义为 MyDataFrame 类的对象——简单。显然,根据定义,type(x)MyDataFrame
  2. 在调用add期间,它会查看接收者对象,即MyDataFrame类的x。这个类实际上定义了方法add。因此,它只是返回该方法的结果,奇怪的是,尝试调用 DataFrame([1, 2, 3]).add(1, 2)。结果会有所不同,因为它查看 pandas.DataFrame 类中定义的 add 方法。
  3. 现在是第三部分 - 让我们应用相同的推理。 reindex 未在 MyDataFrame 中定义。接下来我们应该看哪里?类层次结构,即 pandas.DataFrame。现在,reindex 确实是由此类定义的,并且它返回一个 pandas.DataFrame 对象!。 (参见: http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.reindex.html#pandas.DataFrame.reindex )所以,难怪 y 是一个 pandas DataFrame

现在我不明白你首先通过扩展 pandas DataFrame 来做什么。这样的扩展并不常见。如果您提供您想要做什么的详细信息,也许我们可以提供解决方案。

编辑:您原来的问题与扩展方法或扩展对象有关(C# 有它们,正如您正确指出的那样,JS 原型(prototype)为您提供相同的功能。Python 没有扩展方法/对象作为一等成员(member)。对此进行了讨论。例如 python extension methods )

关于python - 在 python 中创建包装类时,如何让父类(super class)的方法返回包装类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22519013/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com