Python: Как передать переменные между экземплярами класса или получить вызывающую функцию? - PullRequest
10 голосов
/ 21 сентября 2011
class foo():
  def __init__(self)
    self.var1 = 1

class bar():
  def __init__(self):
    print "foo var1"

f = foo()
b = bar()

В foo я делаю что-то, что производит "var1", установленный в 1 В баре я хотел бы получить доступ к содержимому var1

Как я могу получить доступ к var1 в экземпляре класса f из foo из экземпляра b бара

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

Ответы [ 6 ]

16 голосов
/ 30 мая 2012

В качестве общего способа доступа к различным страницам в wxPython и редактирования одной и той же информации рассмотрите возможность создания экземпляра информационного класса в своем классе MainFrame (или как вы его называли) и последующей передачи этого экземпляра на любые другие создаваемые им страницы,Например:

class info():
    def __init__(self):
        self.info1 = 1
        self.info2 = 'time'
        print 'initialised'

class MainFrame():
    def __init__(self):
        a=info()
        print a.info1
        b=page1(a)
        c=page2(a)
        print a.info1

class page1():
    def __init__(self, information):
        self.info=information
        self.info.info1=3

class page2():
    def __init__(self, information):
        self.info=information
        print self.info.info1

t=MainFrame()

Вывод:

initialised
1
3
3

информация инициализируется только после подтверждения наличия только одного экземпляра, но страница1 изменила переменную info1 на 3, а страница2 зарегистрировала это изменение.

7 голосов
/ 28 февраля 2012

Никто не предоставил пример кода, показывающий способ сделать это без изменения аргументов инициализации. Вы можете просто использовать переменную во внешней области видимости, которая определяет два класса. Однако это не будет работать, если один класс определен в отдельном исходном файле от другого.

var1 = None
class foo():
  def __init__(self)
    self.var1 = var1 = 1

class bar():
  def __init__(self):
    print var1

f = foo()
b = bar()
5 голосов
/ 21 сентября 2011

То же, что и на любом языке.

class Foo(object):
    def __init__(self):
        self.x = 42

class Bar(object):
    def __init__(self, foo):
        print foo.x

a = Foo()
b = Bar(a)
1 голос
/ 21 сентября 2011

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

0 голосов
/ 10 августа 2018

Возможно, это было добавлено к языку, так как этот вопрос был задан ...

Глобальное ключевое слово поможет.

x = 5

class Foo():
    def foo_func(self):
        global x    # try commenting this out.  that would mean foo_func()
                    # is creating its own x variable and assigning it a
                    # value of 3 instead of changing the value of global x
        x = 3

class Bar():
    def bar_func(self):
        print(x)

def run():
    bar = Bar()     # create instance of Bar and call its
    bar.bar_func()  # function that will print the current value of x

    foo = Foo()     # init Foo class and call its function
    foo.foo_func()  # which will add 3 to the global x variable

    bar.bar_func()  # call Bar's function again confirming the global
                    # x variable was changed 


if __name__ == '__main__':
    run()
0 голосов
/ 21 сентября 2011

Что-то вроде:

class foo():
  def __init__(self)
    self.var1 = 1

class bar():
  def __init__(self, foo):
    print foo.var1

f = foo()
b = bar(foo)

Вы должны иметь возможность передавать объекты в Python так же, как вы передаете указатели в c ++.

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