Repository: Qiskit/qiskit

Issue:
Can not combine the Result object from the same backend (statevector)
<!-- ⚠️ If you do not respect this template, your issue will be closed -->
<!-- ⚠️ Make sure to browse the opened and closed issues -->

### Informations

- **Qiskit Terra version**: the master branch
- **Python version**: 3.6.5
- **Operating system**: macOS 10.13

### What is the current behavior?
raise error

```
Traceback (most recent call last):
  File "/Users/rchen/Developer/Quantum/qiskit-terra/qiskit/result/_result.py", line 125, in __add__
    copy_of_self += other
  File "/Users/rchen/Developer/Quantum/qiskit-terra/qiskit/result/_result.py", line 108, in __iadd__
    raise QISKitError('Result objects from different backends cannot be combined.')
qiskit._qiskiterror.QISKitError: 'Result objects from different backends cannot be combined.'
```

### Steps to reproduce the problem
Code
```python
from qiskit import QuantumRegister, QuantumCircuit, ClassicalRegister
import qiskit as qk
import numpy as np

num_qubits = 2

q = QuantumRegister(num_qubits, name='q')
c = ClassicalRegister(num_qubits, name='c')
circuits = QuantumCircuit(q, c)
param_idx = 0
for qubit in range(num_qubits):
    circuits.u3(0.0, 0.0, 0.0, q[qubit])
    circuits.u1(3.0, q[qubit])

# circuits.measure(q, c)


my_backend = qk.Aer.get_backend('statevector_simulator')
qobj = qk.compile(circuits=circuits, backend=my_backend)
job = my_backend.run(qobj)
result_a = job.result()

qobj = qk.compile(circuits=circuits, backend=my_backend)
job = my_backend.run(qobj)
result_b = job.result()

result = result_a + result_b

```


### What is the expected behavior?
Result objects are combined without error


### Suggested solutions
None

Note: If I change the backend to `qasm_simulator`, there is no error.




Discussion:
So I dug into this, the underlying issue is that name in most places is not actually a property/string but instead actually a method. So when result is doing the comparison of the backend_name property it's getting a bound method (which doesn't match for different objects) instead of the string it was expecting.

We can fix this for the statevector simulator case by changing the result code to call `result.backend_name()` instead of `result.backend_name`. However there are cases where backend_name is a string and doing this will break those. Ideally I'd like to see everything be a string/property since it's static and calling a function seems unecessary, but it looks like the assumption that it's function is in a bunch of other places throughout the code. I'll unravel the ball of yarn and figure out a way to preserve our interface compatibility while making it behave consistently for all the backends.
so a quick workaround I can check both? 
like comparing `result_a.backend_name() == result_b.backend_name() or result_a.backend_name == result_b.backend_name` 

Resolving patch:
diff --git a/qiskit/backends/aer/statevector_simulator.py b/qiskit/backends/aer/statevector_simulator.py
--- a/qiskit/backends/aer/statevector_simulator.py
+++ b/qiskit/backends/aer/statevector_simulator.py
@@ -56,8 +56,6 @@ def _run_job(self, job_id, qobj):
                 QobjInstruction(name='snapshot', params=[final_state_key])
             )
         result = super()._run_job(job_id, qobj)
-        # Replace backend name with current backend
-        result.backend_name = self.name
         # Extract final state snapshot and move to 'statevector' data field
         for experiment_result in result.results.values():
             snapshots = experiment_result.snapshots
diff --git a/qiskit/backends/aer/statevector_simulator_py.py b/qiskit/backends/aer/statevector_simulator_py.py
--- a/qiskit/backends/aer/statevector_simulator_py.py
+++ b/qiskit/backends/aer/statevector_simulator_py.py
@@ -70,8 +70,6 @@ def _run_job(self, job_id, qobj):
                 QobjInstruction(name='snapshot', params=[final_state_key])
             )
         result = super()._run_job(job_id, qobj)
-        # Replace backend name with current backend
-        result.backend_name = self.name
         # Extract final state snapshot and move to 'statevector' data field
         for experiment_result in result.results.values():
             snapshots = experiment_result.snapshots


Test patch: