gpt4 book ai didi

将多个类方法应用于对象列表的 Pythonic 方式

转载 作者:行者123 更新时间:2023-12-04 12:20:25 29 4
gpt4 key购买 nike

我有一个带有一些内置方法的类。这是该类的抽象示例:

class Foo:
def __init__(self):
self.a = 0
self.b = 0

def addOneToA(self):
self.a += 1

def addOneToB(self):
self.b += 1
为简单起见,我将内置方法总数减少到 2 个,但实际上我的类有接近 20 个。
接下来,我有另一个类,旨在处理 Foo 的列表。实例。
class Bar:
def __init__(self, fooInstances):
self.fooInstances = fooInstances

# Bar([Foo(), Foo(), Foo()])
如果我想申请 Foo 之一怎么办? Foo 的方法 Bar 中的实例?
class Bar:
# ...
def addOneToA(self):
for fooInstance in self.fooInstances:
fooInstance.addOneToA()

def addOneToB(self):
for fooInstance in self.fooInstances:
fooInstance.addOneToB()
上面的例子是我描述的一种方法,但是如果有 20 个 Foo 的类方法,这样做似乎有很多重复的代码。 .或者,我可以做这样的事情:
class Bar:
# ...
def applyFooMethod(self, func, *args):
for fooInstance in self.fooInstances:
fooInstance.func(args)
但我更喜欢有一些东西可以让我打电话 .addOneToA()Bar并将其应用于所有 Foo Bar 中的实例.是否有一种干净的方法可以在不定义 Foo 的所有方法的情况下执行此操作?内 Bar ?

最佳答案

一种方法是覆盖 __getattr__Bar :

class Bar:
def __init__(self, fooInstances):
self.fooInstances = fooInstances

def __getattr__(self, attr):
try:
getattr(self.fooInstances[0], attr)
except AttributeError:
raise AttributeError(f"'Bar' object has no attribute '{attr}'")
else:
def foo_wrapper(*args, **kwargs):
for foo_inst in self.fooInstances:
getattr(foo_inst, attr)(*args, **kwargs)
return foo_wrapper
__getattr__Bar如果在 Bar 上查找属性,则调用对象失败。然后我们试试看是否有 Foo实例具有该属性;如果没有,则提出 AttributeError因为都没有 Bar也不是 Foo接受该属性。但如果 Foo确实有它,我们返回一个函数,当被调用时,在 attr 的每个时刻调用方法( Foo )居住在 Bar目的。
用法:
     ...
# changed this method in Foo to see the passing-an-argument case
def addOneToA(self, val):
self.a += 1
print(f"val = {val}")
...


>>> bar = Bar([Foo(), Foo(), Foo()])

>>> bar.addOneToB()
>>> [foo.b for foo in bar.fooInstances]
[1, 1, 1]

>>> bar.addOneToA(val=87) # could also pass this positionally
val = 87
val = 87
val = 87

>>> bar.this_and_that
AttributeError: 'Bar' object has no attribute 'this_and_that'

关于将多个类方法应用于对象列表的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67506152/

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