class Web(webdriver.Firefox()):
...
class extend(Web):
def __init__(self, session):
self = session
...
class Web(webdriver.Firefox()):
...
class extend(Web):
def __init__(self, session):
self = session
...
_angus_уверен, что на самом деле вам это не нужно
которой хочется временно добавить нужные на данный момент методы
FishHookНу вот уже написал про селениум. Есть вебсервис, имеющий кучу подразделов и всяких внутренних взаимоотношений. Эти подразделы не хочется тянуть в один класс просто для порядку, больно много всего. Есть экземпляр селениума, расширенного некоторыми базовыми для приложения методами, и который запускается в начале тестовой сессии, и к которому постоянно нужно обращаться для тестирования этих подразделов. Логично было бы понаделать классов для подразделов и их наследовать от этого самого селениума. Но сама браузерная сессия должна бы быть общей для всей сессии и желательно не перезапускаться, т.к. запуск браузера – дорогая операция (пара десятков секунд). Поэтому и возникла идея наследовать от уже единожды запущенного экземпляра. Похоже, что-то я глобально не понимаю, но красивого варианта в голову не приходит.
FishHookДа я принцип хочу понять, а селениум там или что – не так важно. (как мне кажется) важно “на лету” модифицировать некий экземпляр класса, который нежелательно многократно пересоздавать. В принципе, сейчас я в __init__ этих вспомогательных классов и передаю этот экземпляр,
_angus_Не надо наследовать ни от какого экземпляра, все экземпляры чего-либо должны быть внедрены в использующий их объект как зависимости. Вам знаком термин “Внедрение зависимостей”?Давайте поступим по-другому. Селениум штука довольно специфичная, мне, скажем, для работы не нужная и не знакомая. Для того, чтобы говорить про ООП, нам селениум не нужен. Попробуйте придумать простой и всем понятный виртуальный пример, про котиков, кирпичные дома или геометрические фигуры - пофигу. И с кодом, конечно же, а то знаете на словах говорить о коде как-то хм…
class Part1:
def __init__(self, session):
self.web = session
def action(self, act):
...
self.web.some_action()
_angus_Да в общем то нет, это называется внедрение через конструктор.
Но это как-то некрасиво, как мне кажется
FishHookЯсно, спасибо, не буду изобретать велосипед…
>>> class A: ... def __init__(self, value): ... self.value = value ... >>> >>> import types >>> >>> a = A(10) >>> >>> def sum(self, value2): ... return self.value + value2 ... >>> a.sum = types.MethodType(sum, a) >>> print(a.sum(5)) 15
JOHN_16Интересно, кстати! Но методов десятки, каждый раз их динамически присваивать – явно что-то да пропустишь, да и конфликты имён возможны.
Можно ж проще через динамическое присваивание
_angus_эээ что знаичт каждый раз? вы их руками в рантайме что ли прописываете? Как то не понятно. Ваше сообщение звучит так будто у вас есть какая то проблема с этим, но я никак не могу понять где. Если у вас много методов … ну оберните их в 1 функцию, которая будет все делать. И вызывайте ее когда надо.
каждый раз их динамически присваивать – явно что-то да пропустишь