Jump to content
Korean Random
ShuraBB

Нужен совет по хуку

Recommended Posts

Пытаюсь в scripts/client/gui/battle_control/arena_info/__init__.py поставить хук на функцию battleEndWarningEnabled

 

Пробовал и стандартно from gui.battle_control import arena_info и import gui.battle_control.arena_info as arena_info - не ставится.

 

import gui.battle_control.arena_info as arena_info
#from gui.battle_control import arena_info

def EndWarning():
	print 'Хук поставили'
	return False

arena_info.battleEndWarningEnabled = EndWarning
#arena_info.battleEndWarningEnabled = EndWarning
Edited by ShuraBB

Share this post


Link to post

Short link
Share on other sites

Оно работает, почти...

 

Функция вызывается из

gui/Scaleform/daapi/view/battle/TimersBar и

gui/Scaleform/Battle

 

В TimersBar импорт делается from gui.battle_control import arena_info

и тут как раз хук и работает

 

а вот в Battle, через from gui.battle_control.arena_info import battleEndWarningEnabled

и тут он не срабатывает

Share this post


Link to post

Short link
Share on other sites

и тут он не срабатывает

Потому что кому-то стоит перечитать доки на питон. Ибо то, что происходит вполне логично.

Значение любой переменной в питоне есть ссылка на объект. Не сам объект, а именно ссылка на него. Поэтому меняя значение переменной, ты меняешь не объект, а ссылку.

Копируя значение, ты копируешь ссылку, сам объект не копируется.

Это объясняет два явления:

1. Импорт функции, который произошел до установки хука, скопировал ссылку на старый объект. Поэтому и не работает.

2. Изменение атрибутов класса затрагивает все объекты этого класса, ибо объект подтягивает методы из класса.

 

Упрощенный пример, в комментах аналогия

>>>a = 5 # function def
>>>b = a # function import
>>>a = 6 # hook install
>>>print b # imported function call
5
Бесплатный совет: не ставь хуки на независимые функции (функции модуля). Edited by GPCracker

Share this post


Link to post

Short link
Share on other sites

а что сразу тут не?

from gui.Scaleform.daapi.view.battle.battle_end_warning_panel import BattleEndWarningPanel

Share this post


Link to post

Short link
Share on other sites

>а что сразу тут не?
Предлагаешь вообще панель не выводить? Боюсь косяки будут.

Share this post


Link to post

Short link
Share on other sites

>а что сразу тут не?

Предлагаешь вообще панель не выводить? Боюсь косяки будут.

ну я там хукаю, косяков никаких нет

Share this post


Link to post

Short link
Share on other sites

>ну я там хукаю, косяков никаких нет
Была мысль красиво сделать - False и все, но видно не судьба :-)))

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...