Как реализовать указатели в Python? (или любое другое подобное решение) - PullRequest
0 голосов
/ 22 марта 2012

У меня есть класс, он будет реализован во многих случаях.Я хочу сохранить связи между некоторыми экземплярами и передавать сообщения между ними.В C ++ я могу сделать это следующим образом:

class A
{
   A (*connections)[];
   int sum;

public:
   void pass(int index)
   {
       connections[index] -> receive(sum);
   }
   void receive(int input)
   {
       sum += input;
   }
}

Затем Мне нужно только добавить указатели других экземпляров к connections[], я могу передавать сообщения друг другу.1007 *

В настоящее время я должен использовать Python, , но Python не поддерживает указатели .Интересно, каково правильное решение или шаблон проектирования для решения этой проблемы?

Заранее спасибо.

Ответы [ 4 ]

6 голосов
/ 22 марта 2012

Python не нуждается в указателях для достижения этой цели, поскольку каждая переменная является ссылкой на объект. Эти ссылки немного отличаются от ссылок C ++ тем, что их можно назначать - очень похоже на указатели в C ++.

Итак, чтобы достичь того, что вы ищете, вам просто нужно сделать что-то вроде этого:

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

И просто чтобы доказать, что это работает, как и ожидалось:

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

Итак, как вы можете видеть, мы изменили исходные объекты a1 и a2, вызвав их через ссылки в a3

3 голосов
/ 22 марта 2012

В Python у нас есть имена и контейнеры (например, list), которые ссылаются на объекты, аналогично ссылкам в C ++.Пример - a и b ссылаются на один и тот же объект:

>>> a = object()
>>> b = a
>>> a is b
True
1 голос
/ 22 марта 2012

Python стандартный способ обработки вещей поддерживает вас. В python каждая переменная является ссылкой.

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())

Выход:

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]
1 голос
/ 22 марта 2012

Я бы сказал, что вы, возможно, ищете атрибут класса .

Может, вам подойдет что-нибудь подобное?

class A(object):
    connection = []
    def send(self, num):
        self.connection.append(num)
    def receive(self):
        return self.connection.pop(-1)

Пример:

>>> x = A()
>>> y = A()
>>> x.send(10)
>>> y.receive()
10

В любом случае, возможно, вы захотите реализовать это с помощью модуля queue.

Редактировать: Я думаю, вы хотите receive метод, который будет выглядеть следующим образом:

def receive(self):
    s = sum(self.connection)
    self.connection[:] = []    # empty the list
    return s

Помните, что вы никогда не должны присваивать что-либо атрибуту connection, иначе вы потеряете ссылку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...