Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 1, 2012 20:04:21

Xcopy
Зарегистрирован: 2012-10-20
Сообщения: 9
Репутация: +  0  -
Профиль   Адрес электронной почты  

Обратная связь между классами

Всем привет!
Сразу перейду к вопросу:

У меня есть класс А и B

class A(object):
    def __init_(self):
        pass
class B(object):
    def __init_(self):
        self.objectA = A()
    def func(self):
        print("HELLO WORLD!")
   

Вопрос такой: как из объекта класса А обратиться к функции func класса B в котором создан объект класа A?
Я решил эту проблемму передавая в объект класса А ссылку на функцию func при создании объекта objectA.
То, что сделал я приемлимо с точки зрения хорошего python кода??
И есть ли какие-нибудь более изящные методы решения этой задачи?

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

Отредактировано Xcopy (Дек. 1, 2012 20:29:19)

Офлайн

#2 Дек. 1, 2012 20:56:40

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Обратная связь между классами

Можно с помощью пакета inspect http://docs.python.org/2/library/inspect.html
провести анализ стека вызовов и найти того кто вызвал конструктор. Но передать ссылку на функцию? как сделали вы гораздо лучше.



Офлайн

#3 Дек. 1, 2012 20:59:55

Xcopy
Зарегистрирован: 2012-10-20
Сообщения: 9
Репутация: +  0  -
Профиль   Адрес электронной почты  

Обратная связь между классами

doza_and, Спасибо большое!

Офлайн

#4 Дек. 1, 2012 21:06:00

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Обратная связь между классами

Все зависит от контекста задачи. Где-то это допустимый код, где-то можно сделать “правильнее”. Обычно мне требовался объект целиком, ссылку на отдельный метод никогда не передавал.



Офлайн

#5 Дек. 1, 2012 21:13:57

Xcopy
Зарегистрирован: 2012-10-20
Сообщения: 9
Репутация: +  0  -
Профиль   Адрес электронной почты  

Обратная связь между классами

Soteric, пишу клиент для чата.
У меня есть главный класс Client:

from authorization import AuthorizationWidget
class Client(object):
    def __init__(self):
        self.authWidget = AuthorizationWidget(self.authValidator)
        self.authWidget.show()
    def authValidator(self, nick):
        if len(nick) > 15:
            return "nick is too long"
        else:
  #обращение к серверу и бла бла... и если ник верный, то 
            return True
            self.authWidget.close()
client = Client()

Этот класс создает authWidget - объект класса AuthorizationWidget. AuthorizationWidget - это небольшое окошко для авторизации пользователя по нику.

По моей задумке, только класс Client может обращаться к серверу, поэтому, класс AuthorizationWidget должен обратиться к методу authValidator класса Client, чтобы он проверил ник введенный в поле класса AuthorizationWidget на правильность)

Ну вот поэтому я и передаю в конструктор AuthorizationWidget ссылку на функцию authValidator

Офлайн

#6 Дек. 1, 2012 21:20:01

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Обратная связь между классами

Думаю все в порядке :)



Офлайн

#7 Дек. 1, 2012 21:21:31

Xcopy
Зарегистрирован: 2012-10-20
Сообщения: 9
Репутация: +  0  -
Профиль   Адрес электронной почты  

Обратная связь между классами

Soteric, Спасибо!)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version