Python 如何在两级类对象继承权上执行数学运算

Python 如何在两级类对象继承权上执行数学运算,python,Python,我已经建立了一个两级类对象层次结构-我不确定我是否以最有效的方式进行了此操作,或者我是否使用了正确的术语(不太可能),但下面是一个可重复的示例: import numpy as np class mem: """this is a member with characteristics""" def __init__(self,i): self.val=i*i class ens: """this is the ensemble""" def

我已经建立了一个两级类对象层次结构-我不确定我是否以最有效的方式进行了此操作,或者我是否使用了正确的术语(不太可能),但下面是一个可重复的示例:

import numpy as np

class mem:
    """this is a member with characteristics"""
    def __init__(self,i):
        self.val=i*i

class ens:
    """this is the ensemble"""
    def __init__(self,n):
        self.mem=[]
        for i in range(n):
            self.mem.append(mem(i))

num=10
e=ens(num)

print(e.mem[4].val)
按预期给出16个答案

我的问题是如何执行数学运算,例如集合成员值的最大值或平均值

我希望我能做这样的事情:

np.mean(e.mem[:].val)
但这就产生了错误

AttributeError: 'list' object has no attribute 'val'
我能开始工作的唯一方法是将值复制到一个列表中,然后执行平均值,但这似乎不是很pythony。。。我相信有一个更整洁的解决办法

l=[]
for i in range(num):
    l.append(e.mem[i].val)
np.mean(l)
这起作用并提供: 28.5

有关使用迭代器的更多“pythony”方法,可以避免创建重复列表:

num=10
e=ens(num)

from statistics import mean

print(mean(i.val for i in e.mem))

print(max(i.val for i in e.mem))
印刷品:

28.5
81

您可以在类
env
中添加方法或属性,以从
mem
中的所有元素中获取
val

class ens:

    @property
    def val(self):
        return [x.val for x in self.mem]
然后您可以使用
e.val

print(np.mean(e.val))


您使用普通列表来保存元素-您必须将它们保存在numpy的数组或pandas的数据帧中,才能在没有
for
-循环的情况下工作。什么是
pval
?你的意思是
val
?是的,对不起“val”,剪切和粘贴错误,更正了打字错误,谢谢非常整洁,谢谢。。。我不知道属性功能。如果没有
@property
,您将在
e.val()
中使用
()
来获取值。所以差别不大。
import numpy as np

class mem:
    """this is a member with characteristics"""
    def __init__(self,i):
        self.val=i*i

class ens:
    """this is the ensemble"""
    def __init__(self, n):
        self.mem = []
        for i in range(n):
            self.mem.append(mem(i))

    @property
    def val(self):
        return [x.val for x in self.mem]

num = 10
e = ens(num)

print(e.mem[4].val)

print(np.mean(e.val))