DIVlNATOR 7 Posted May 20, 2020 Добрый день товарищи... Python до этого не изучал, многое что не особо понятно после Java. Немного не пойму строчку из мода "mod_versus": old_getFullName = BWChannelEntity.getFullName 1) почему BWChannelEntyty - это статичный класс? 2) почему "getFullName" укзана как переменная, а не метод? 3) а. Если выполнить из PJOrion, то в первом случае исключение: *** NameError: name 'BWChannelEntity' is not defined *** *** <unbound method BWChannelEntity.getFullName> б. А если выполнить как BWChannelEntity.getFullName() то: *** TypeError: unbound method getFullName() must be called with BWChannelEntity instance as first argument (got nothing instead) 4) Я наверно не совсем понимаю как получить обьявленный ранее обьект и изменить его... В конечном итоге, я хочу получить: Найти окно клан-чата, и переименовать его Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #482685 Posted May 20, 2020 (edited) Ищите дальше, а способ что вы написали можете забыть, он не верный Edited May 20, 2020 by Ekspoint 1 Quote Share this post Link to post Short link Share on other sites
DIVlNATOR 7 #482687 Posted May 20, 2020 @Ekspoint Спасибо... Еще вот так пробовал, но там нету сеттера: from messenger.storage import storage_getter, ChannelsStorage class ClanChannelCriteria(object): def filter(self, channel): return channel.getName() == '[SPCTE]' storage = storage_getter('channels')() if isinstance(storage, ChannelsStorage): channel = storage.getChannelByCriteria(ClanChannelCriteria()) print channel.getName() Quote Share this post Link to post Short link Share on other sites
DIVlNATOR 7 #482727 Posted May 21, 2020 (edited) @Ekspoint Вроде разобрался... Но немного пока для меня это магия, что можно заменить метод инициализированного класса своим методом... Edited May 21, 2020 by DIVlNATOR Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #482843 Posted May 23, 2020 (edited) 20.05.2020 в 15:22, DIVlNATOR сказал: 1) почему BWChannelEntyty - это статичный класс? Тыц. Это обычный класс, а getFullName это функция. Можно переопределить функцию в классе на свою, но делать это нужно до того, как движок походу работы клиента воспользуется этим классом для создания рабочего экземпляра объекта. Edited May 23, 2020 by StranikS_Scan 1 Quote Share this post Link to post Short link Share on other sites
DIVlNATOR 7 #482845 Posted May 23, 2020 @StranikS_Scan Спасибо. Я понял уже... Прочитал про getAttr и setAttr. Попутно просто Python изучаю. Я вот так еще обернул в декоратор: # coding=utf-8 from gui.mods.autumn_core import AutumnEnum # Декоратор для замены методов обьявленного класса # # @Override(Class, 'method') # def test(self, *args) # class Override: __methodType = None __methodName = None __clazz = None MethodType = AutumnEnum(['FUNCTION', 'METHOD', 'STATICMETHOD']) @classmethod def __init__(cls, clazz, method_name, method_type=MethodType.FUNCTION): """ :type clazz: type :type method_name: str :type method_type: MethodType :return None """ cls.__clazz = clazz cls.__methodName = method_name cls.__methodType = method_type @classmethod def __call__(cls, *args, **kwargs): func = args[0] if type(func == 'function'): if cls.__methodType == Override.MethodType.METHOD: cls.__overrideMethod(func) elif cls.__methodType == Override.MethodType.STATICMETHOD: cls.__overrideStaticMethod(func) else: cls.__overrideMethod(func) @classmethod def __override(cls, new_method): if hasattr(cls.__clazz, cls.__methodName): if isinstance(getattr(cls.__clazz, cls.__methodName), property): setattr(cls.__clazz, cls.__methodName, property(new_method)) else: setattr(cls.__clazz, cls.__methodName, new_method) @classmethod def __overrideStaticMethod(cls, new_method): cls.__override(staticmethod(new_method)) @classmethod def __overrideMethod(cls, new_method): cls.__override(classmethod(new_method)) class Test(object): def test(self): return 1234 print Test.test() @Override(clazz=Test, method_name='test') def test2(): return 555 print Test.test() Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #483064 Posted May 27, 2020 23.05.2020 в 13:47, DIVlNATOR сказал: @StranikS_Scan Спасибо. Я понял уже... Прочитал про getAttr и setAttr. Попутно просто Python изучаю. Я вот так еще обернул в декоратор: # coding=utf-8 from gui.mods.autumn_core import AutumnEnum # Декоратор для замены методов обьявленного класса # # @Override(Class, 'method') # def test(self, *args) # class Override: __methodType = None __methodName = None __clazz = None MethodType = AutumnEnum(['FUNCTION', 'METHOD', 'STATICMETHOD']) @classmethod def __init__(cls, clazz, method_name, method_type=MethodType.FUNCTION): """ :type clazz: type :type method_name: str :type method_type: MethodType :return None """ cls.__clazz = clazz cls.__methodName = method_name cls.__methodType = method_type @classmethod def __call__(cls, *args, **kwargs): func = args[0] if type(func == 'function'): if cls.__methodType == Override.MethodType.METHOD: cls.__overrideMethod(func) elif cls.__methodType == Override.MethodType.STATICMETHOD: cls.__overrideStaticMethod(func) else: cls.__overrideMethod(func) @classmethod def __override(cls, new_method): if hasattr(cls.__clazz, cls.__methodName): if isinstance(getattr(cls.__clazz, cls.__methodName), property): setattr(cls.__clazz, cls.__methodName, property(new_method)) else: setattr(cls.__clazz, cls.__methodName, new_method) @classmethod def __overrideStaticMethod(cls, new_method): cls.__override(staticmethod(new_method)) @classmethod def __overrideMethod(cls, new_method): cls.__override(classmethod(new_method)) class Test(object): def test(self): return 1234 print Test.test() @Override(clazz=Test, method_name='test') def test2(): return 555 print Test.test() декораторы можно взять у хвм и городить ничего не нужно) 2 Quote Share this post Link to post Short link Share on other sites
DIVlNATOR 7 #483083 Posted May 28, 2020 (edited) @Ekspoint Спасибо.. Да недавно натолкнулся в исходниках night_dragon_on... Единственное я не понял как работать с кодировкой... В Orione данный фокус норм отрабатывал: string = 'Привет всем!'.decode('cp1251') string.encode("utf-8") После компиляции в названии окошка в боевом клиенте надпись типа "Ppp". В шапке файла стоит указание на кодировку файла... # -*- coding: utf-8 -*- Причем в клан чат пишется все по русски. Не знаю... Может смотрю в сторону того, что нужно найти как подгружаются файлы *.mo. Добавить свой файлик и из него уже забирать фразы.. Но думаю, что есть способ легче))) Edited May 28, 2020 by DIVlNATOR Quote Share this post Link to post Short link Share on other sites