如何为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数组形式)
二、方案说明
- 通用映射方法
map:这是最灵活的方案,适用于所有外部函数(无论是numpy的方法,还是自定义函数),只需把函数传入map,就能自动应用到每个元素上。 - 特定函数适配(如
__array__):对于像numpy这类有特殊协议的库,可以实现对应的魔法方法,让外部函数直接识别A_Collection并按预期处理。但这种方式需要针对不同函数单独实现,通用性不如map方法。
如果你希望对任意外部函数都能像操作单个A对象一样操作A_Collection,map方法是最稳妥的选择——因为你无法预知所有外部函数的行为,显式映射能避免歧义。
内容的提问来源于stack exchange,提问作者Tokisaki963
相关产品推荐
相关产品推荐

