LINUX.ORG.RU

Как из метода класса вызвать метод другого класса, когда оба внутри третьего класса?

 ,


0

1

Так можно:

class A(object):
	def func(self):
		print "it works"

class B(object):
	def func2(self):
		a.func()

if __name__ == '__main__':
		a = A()
		b = B()
		b.func2()

А вот так уже нельзя:

class A(object):
	def func(self):
		print "it works"

class B(object):
	def func2(self):
		a.func()

class C(object):
	def __init__(self):
		a = A()
		b = B()
		b.func2()

if __name__ == '__main__':
	c = C()

Или я просто не вкурил, как вызвать вышележащий namespace. Или я делаю нечто нехорошее, за что бьют канделябром.

Зачем мне это нужно: в программе леплю класс, абстрагирующий от остального кода GUI. Внутри него должно крутится все связанное с *graphical toolkit name*. Два окна, два класса. В одном прилетает callback, оно себя закрывает и должно вызывать show для другого окна.


1) передай в B инстанс a параметром. Я за этот вариант.

2) сделай глобальную переменную a (см. оператор global).

PS Кстати, перменные глобальны только в пределах одного модуля.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Сделал передачу инстанса в __init__(), заработало, спасибо.

Другие варианты как подобные вещи разруливать существуют? Имхо, если есть сотня окон то начинается трэш и угар: они создаются и уничтожаются. Придется создавать список и регулярно обновлять его. Выглядит как костыль. А глобальные переменные всегда предавались анафеме)

Gregon
() автор топика
Ответ на: комментарий от Gregon

я не понимаю что ты хочешь сделать, но раз прилетает callback то пусть прилетает вместе с инстансом для которого надо вызвать callback.

А список с регулярными обновлениями делается просто, посмотри weakref модуль. Дальше в __init__ просто в этот контейнер запихиваешь self.

типа такого:

import weakref
container = weakref.weakSet()
class Test:
  def __init__(self):
    container.add(self)
true_admin ★★★★★
()

Может тебя так устроит?

class A(object):
        def func(self):
                print "it works"

class B(object):
        def func2(self, ns):
                ns.a.func()

class C(object):
        def __init__(self):
                self.a = A()
                self.b = B()
                self.b.func2(self)

if __name__ == '__main__':
        c = C()
k0valenk0_igor ★★★
()
Ответ на: комментарий от true_admin

Callback прилетает после нажатия кнопки в визарде первой настройки, с ним прилетает исключительно инфа «закрой окно, я закончил».

Контейнеры посмотрю.

Gregon
() автор топика
Ответ на: комментарий от Gregon

я думаю ты что-то не то делаешь. Я надеюсь ты не пытаешься написать абстрактную обёртку для любого *graphical toolkit name*?

true_admin ★★★★★
()
Ответ на: комментарий от k0valenk0_igor

Отлично, так тоже работает и теперь у меня есть доступ к неймспейсу суперкласса, большое спасибо.

Gregon
() автор топика

Или вот так?

class A(object):
        def func(self):
                print "it works"

class B(object):
        def func2(self):
                self.a.func()

class C(object):
        def __init__(self):
                a = A()
                b = B()
                b.a = a
                b.func2()

if __name__ == '__main__':
        c = C()

k0valenk0_igor ★★★
()
Ответ на: комментарий от true_admin

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

Gregon
() автор топика
Ответ на: комментарий от tailgunner

В данном случае экземпляр (объект) класса, в котором находится внутри несколько других объектов.

Gregon
() автор топика

Как из метода класса вызвать метод другого класса, когда оба внутри третьего класса?

как минимум так:

class A(object):
	def func(self):
		print "it works"

class B(object):
	def func2(self, a):
		a.func()

class C(object):
	def __init__(self):
		a = A()
		b = B()
		b.func2(a)

if __name__ == '__main__':
	c = C()

AGUtilities ★★★
()
Ответ на: комментарий от Gregon

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

я так и думал. Забей на это потому что:

1) не справишься

2) это бессмысленная задача, 99% времени всё равно будешь сидеть либо на qt, либо на gtk

4) делать абстрактный универсальный код «на все случаи жизни» это классическая ошибка программистов. Протрахаешься неделю/месяц и забьёшь, а результата не получишь

5) даже если сделаешь костыль он будет страшен потому что тулкиты между собой отличаются не только именами функций, но ещё архитектурой. Поэтому у тебя будет, по-сути, написаны очень разные обёртки с одним API. Так сделай сразу как надо: разбей свою программу на низкоуровневую библиотеку и к ней напиши несколько интерфейсов.

Короче, потрать время с большей пользой.

true_admin ★★★★★
()
Последнее исправление: true_admin (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.