python - 自动方法扩展?

标签 python python-3.x

<分区>

我有一个 Python 类 MyObject(tuple 的子类)和另一个用于一组这些对象的类 MyObjectSet(一个子类)。我希望,对于我为 MyObject 定义的任何非内置方法,为 MyObjectSet 定义一个同名方法,其值等于MyObjectSet 内容的方法。

我原以为像下面的代码这样的东西会起作用,但结果与我的预期结果不符。在实践中,MyObjectMyObjectSet 有更多的东西并且是合理的。

class MyObject(tuple):
    def stat_1(self):
        return len(self)
    
    def stat_2(self):
        return sum(self)

class MyObjectSet(set):
    pass

for stat_name in dir(MyObject):
    if not stat_name.startswith("__"):
        stat_func = getattr(MyObject, stat_name)
        if callable(stat_func):
            setattr(MyObjectSet, stat_name, lambda S: sum(stat_func(p) for p in S))

if __name__ == "__main__":
    S = MyObjectSet(MyObject(t) for t in [(1,2), (3,4)])
    
    result, expected = S.stat_1(), sum(p.stat_1() for p in S)
    print(f"S.size() = {result}, expected {expected}")
    
    result, expected = S.stat_2(), sum(p.stat_2() for p in S)
    print(f"S.sum() = {result}, expected {expected}")

有什么办法可以实现这个功能吗?

最佳答案

用这个替换你的 lambda:

lambda S, f=stat_func: sum(f(p) for p in S)

它将 stat_func 复制到 f 中,而不是捕获对它的引用,这是您原始代码中发生的事情(所以所有 stat_funcs 在不同的 lambda 表达式中最终成为分配给 for 循环中的 stat_func 的最后一个值。

关于python - 自动方法扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63428025/

相关文章:

python - 为什么多线程Python程序在ec2微实例上速度很慢?

python - 为什么不立即释放匿名 (C)Python 对象?

python - 在 Django 中发布 ics 提要

macos - 如何检查 Python3 是否是用 '--enable-shared' 构建的?

python - 使用列表选择 Pandas MultiIndex DataFrame 中的单元格

python - 没有浏览器的 webrtc

python - 我如何在 python 中添加字节数组?

python - 使用 dataframe.query 从 pd.DataFrame 中包含的列表中选择值

python - 加入列表中的元组

python - 按钮和文字闪烁