python 3.7.0
在以下代码中
a+a
和a.__add__(a)
可能不同
如何让a+a
返回a.__add__(a)
?
import tensorflow as tf
class T(tf.Tensor):
def __init__(self, data):
super().__init__(data.op, data.value_index, data.dtype)
def res(self, arg):
print("ADD")
return super().__add__(arg)
setattr(self,"__add__",res.__get__(self,T))
a = T(tf.constant([1,2,3]))
a+a
print("--- a line ---")
a.__add__(a)
运行并获取
--- a line ---
ADD
因为我想用相似的规则重新加载几个内置函数
我想使用循环来实现。
因此直接在
之类的类中定义函数class lalala():
def __add__(self,args):
return blabla
不适用于我
顺便说一句,我发现元类的作品
import tensorflow as tf
class MetaT(type):
def __new__(cls, n, b, a):
def res(self, arg):
print("ADD")
return super(self.__class__, self).__add__(arg)
a["__add__"] = res
return type.__new__(cls, n, b, a)
class T(tf.Tensor, metaclass=MetaT):
def __init__(self, D):
super().__init__(D.op, D.value_index, D.dtype)
a = T(tf.constant([1,2,3]))
b = a+a
print("--- a line ---")
b = type(a).__add__(a,a)
此输出:
ADD
--- a line ---
ADD
答案 0 :(得分:0)
Dunder方法是从类而不是其实例中调用的。在这里,您覆盖a.__add__
而不是T.__add__
。
您需要在类主体中声明__add__
。
class T(tf.Tensor):
def __init__(self, data):
super().__init__(data.op, data.value_index, data.dtype)
def __add__(self, arg):
print("ADD")
return super().__add__(arg)
a = T(tf.constant([1,2,3]))
a+a # prints: ADD