You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Python类A实现可继承属性与方法的A_Collection集合类?

实现A_Collection类:代理属性方法与外部函数适配

你已经完成了A_Collection对A类属性和方法的代理,但要处理np.array这类外部函数,需要针对性实现,以下是具体方案:

一、优化现有属性/方法代理逻辑

你的现有代码已经能处理属性和方法,但ismethod仅能识别绑定方法,换成callable()可兼容更多可调用属性(比如类中定义的静态方法、类方法,或赋值给属性的函数):

import numpy as np

class A():
    def __init__(self, i):
        self.i = i

    def add_one(self):
        return self.i + 1

class A_Collection(list):
    def __getattr__(self, name):
        attrs = [getattr(a, name) for a in self]
        # 用callable判断是否为可调用对象,兼容更多场景
        if callable(attrs[0]):
            def collection(*args, **kwargs):
                return [attr(*args, **kwargs) for attr in attrs]
            return collection
        else:
            return attrs
    
    # 新增:通用外部函数映射方法
    def map(self, func, *args, **kwargs):
        """将任意外部函数应用到集合内的每个元素"""
        return [func(a, *args, **kwargs) for a in self]
    
    # 新增:针对numpy的适配方法(可选)
    def __array__(self):
        """让np.array直接处理集合内每个元素"""
        return np.array([np.array(a) for a in self])

# 测试
ac = A_Collection([A(5), A(6), A(7)])
print(ac.i)  # 输出 [5, 6, 7]
print(ac.add_one())  # 输出 [6, 7, 8]

# 方案1:用map方法处理任意外部函数
print(ac.map(np.array))  # 输出 [array(5), array(6), array(7)]

# 方案2:直接调用np.array(因为实现了__array__)
print(np.array(ac))  # 输出 [[5]
                     #        [6]
                     #        [7]] (或类似的numpy数组形式)

二、方案说明

  1. 通用映射方法map:这是最灵活的方案,适用于所有外部函数(无论是numpy的方法,还是自定义函数),只需把函数传入map,就能自动应用到每个元素上。
  2. 特定函数适配(如__array__):对于像numpy这类有特殊协议的库,可以实现对应的魔法方法,让外部函数直接识别A_Collection并按预期处理。但这种方式需要针对不同函数单独实现,通用性不如map方法。

如果你希望对任意外部函数都能像操作单个A对象一样操作A_Collection,map方法是最稳妥的选择——因为你无法预知所有外部函数的行为,显式映射能避免歧义。

内容的提问来源于stack exchange,提问作者Tokisaki963

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:13:16