gpt4 book ai didi

python - 类定义中的通用二元运算?

转载 作者:行者123 更新时间:2023-11-28 22:33:40 30 4
gpt4 key购买 nike

我正在用 Python 3 编写一个小型线性代数模块,其中有许多二元运算符需要定义。由于二元运算符的每个定义本质上是相同的,只是运算符本身发生了变化,我想通过只编写一次通用二元运算符定义来节省一些工作。

例如:

class Vector(tuple):
def __new__(self, x):
super().__new__(x)

# Binary operators

def __add__(self, xs):
try:
return Vector(a + x for a, x in zip(self, xs)))
except:
return Vector(a + x for a in self)

def __and__(self, xs):
try:
return Vector(a & x for a, x in zip(self, xs))
except:
return Vector(a & x for a in self)

... # mul, div, or, sub, and all other binary operations

上面的二元运算符都具有相同的形式。仅更改了运算符。我想知道我是否可以同时编写所有运算符,如下所示:

def __bop__(self, xs):
bop = get_bop_somehow()
try:
return Vector(bop(a, x) for a, x in zip(self, xs)))
except:
return Vector(bop(a, x) for a in self)

我听说 Python 可以用 __getattr__ 方法做神奇的事情,我试着用它来提取运算符的名称,如下所示:

def __getattr__(self, name):
print('Method name:', name.strip('_'))

但是,不幸的是,这仅在使用完整方法名称调用时有效,而在使用运算符时无效。如何编写通用的二元运算符定义?

最佳答案

您可以使用类装饰器来改变您的类,并在工厂函数的帮助下将它们全部添加进来:

import operator

def natural_binary_operators(cls):
for name, op in {
'__add__': operator.add,
'__sub__': operator.sub,
'__mul__': operator.mul,
'__truediv__': operator.truediv,
'__floordiv__': operator.floordiv,
'__and__': operator.and_,
'__or__': operator.or_,
'__xor__': operator.xor
}.items():
setattr(cls, name, cls._make_binop(op))

return cls


@natural_binary_operators
class Vector(tuple):
@classmethod
def _make_binop(cls, operator):
def binop(self, other):
try:
return cls([operator(a, x) for a, x in zip(self, other)])
except:
return cls([operator(a, other) for a in self])

return binop

还有其他一些方法可以做到这一点,但总体思路仍然相同。

关于python - 类定义中的通用二元运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39644885/

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