a .__ add __(a)与a + a不同

时间:2018-09-29 21:11:42

标签: python

python 3.7.0

在以下代码中

a+aa.__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

1 个答案:

答案 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