I have a Class, it will be implemented to be many instances. I want to keep connections between some of the instances, and pass messages among them. In C++, I can do this like:
class A
{
A (*connections)[];
int sum;
public:
void pass(int index)
{
connections[index] -> receive(sum);
}
void receive(int input)
{
sum += input;
}
}
Then I only need to add pointers of other instances to connections[]
, I can pass messages among them with each other.
Currently I have to use Python doing this, but Python doesn't support pointers . I wonder what is the proper solution, or design pattern, to solve this problem?
Thank you in advance.
Python doesn't need pointers in order to achieve this as every variable is a reference to an object. These references are slightly different from C++ references, in that they can be assigned to - much like pointers in C++.
So to achieve what you're looking for, you'd just need to do something like this:
class A(object):
def __init__( self, connections, sum ):
self.connections = connections
self.sum = sum
def passToConnections( self, index ):
self.connections[ index ].receive( self.sum )
def receive( self, input ):
self.sum += input
And just to prove that this works as expected:
>>> a1 = A( [], 0 )
>>> a2 = A( [], 0 )
>>> a3 = A( [ a1, a2 ], 10 )
>>> a3.passToConnections( 0 )
>>> a3.passToConnections( 1 )
>>> a3.passToConnections( 1 )
>>> print a1.sum
10
>>> print a2.sum
20
So as you can see we have altered the original objects a1
and a2
by calling through to them via the references in a3
In Python we have names and containers (such as list
) that refer to objects, similar to references in C++. Example -- a and b refer to the same object:
>>> a = object()
>>> b = a
>>> a is b
True
I'd say that you might be looking for a class attribute .
Would something like this work for you?
class A(object):
connection = []
def send(self, num):
self.connection.append(num)
def receive(self):
return self.connection.pop(-1)
Example:
>>> x = A()
>>> y = A()
>>> x.send(10)
>>> y.receive()
10
Anyway you might want to implement this with the queue
module.
Edit: I'd guess that you want the receive
method to look like:
def receive(self):
s = sum(self.connection)
self.connection[:] = [] # empty the list
return s
Beware that you should never assign anything to the connection
attribute or you'll loose the reference.
Python standard way of handling things supports you. In python every variable is a reference.
class A:
def __init__(self, name, lsum):
self.__name = name
self.__sum = lsum
self.__connections = []
def add_connection(self, con):
self.__connections.append(con)
def send_signal(self, cidx):
print("Send signal from [%s] to [%s]" %
(self.__name, self.__connections[cidx].__name))
self.__connections[cidx].receive(self.__sum)
def receive(self, lsum):
print("Add [%s] to [%s] in [%s]" % (lsum, self.__sum, self.__name))
self.__sum += lsum
def get_sum(self):
return self.__sum
a = A("Obj1", 10)
b = A("Obj2", 20)
c = A("Obj3", 30)
a.add_connection(b)
a.add_connection(c)
a.send_signal(0)
a.send_signal(1)
print("Sum A [%s]" % a.get_sum())
print("Sum B [%s]" % b.get_sum())
print("Sum C [%s]" % c.get_sum())
Output:
Send signal from [Obj1] to [Obj2]
Add [10] to [20] in [Obj2]
Send signal from [Obj1] to [Obj3]
Add [10] to [30] in [Obj3]
Sum A [10]
Sum B [30]
Sum C [40]
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.