Найти - Пользователи
Полная версия: Наследование от существующего экземпляра класса?
Начало » Python для новичков » Наследование от существующего экземпляра класса?
1 2
_angus_
Есть несколько классов, которые удобно было бы использовать как расширение некоего базового класса. При этом хочется расширить уже имеющийся экземпляр (в моем случае это запущенная сессия селениума, которой хочется временно добавить нужные на данный момент методы). Кроме как
class Web(webdriver.Firefox()):
...
class extend(Web):
def __init__(self, session):
self = session
...
в голову ничего не приходит. Есть методы покрасивее?
FishHook
_angus_
которой хочется временно добавить нужные на данный момент методы
уверен, что на самом деле вам это не нужно
дайте хотя бы один юз-кейс
_angus_
FishHook
Ну вот уже написал про селениум. Есть вебсервис, имеющий кучу подразделов и всяких внутренних взаимоотношений. Эти подразделы не хочется тянуть в один класс просто для порядку, больно много всего. Есть экземпляр селениума, расширенного некоторыми базовыми для приложения методами, и который запускается в начале тестовой сессии, и к которому постоянно нужно обращаться для тестирования этих подразделов. Логично было бы понаделать классов для подразделов и их наследовать от этого самого селениума. Но сама браузерная сессия должна бы быть общей для всей сессии и желательно не перезапускаться, т.к. запуск браузера – дорогая операция (пара десятков секунд). Поэтому и возникла идея наследовать от уже единожды запущенного экземпляра. Похоже, что-то я глобально не понимаю, но красивого варианта в голову не приходит.
FishHook
_angus_
Не надо наследовать ни от какого экземпляра, все экземпляры чего-либо должны быть внедрены в использующий их объект как зависимости. Вам знаком термин “Внедрение зависимостей”?

Давайте поступим по-другому. Селениум штука довольно специфичная, мне, скажем, для работы не нужная и не знакомая. Для того, чтобы говорить про ООП, нам селениум не нужен. Попробуйте придумать простой и всем понятный виртуальный пример, про котиков, кирпичные дома или геометрические фигуры - пофигу. И с кодом, конечно же, а то знаете на словах говорить о коде как-то хм…
_angus_
FishHook
_angus_Не надо наследовать ни от какого экземпляра, все экземпляры чего-либо должны быть внедрены в использующий их объект как зависимости. Вам знаком термин “Внедрение зависимостей”?Давайте поступим по-другому. Селениум штука довольно специфичная, мне, скажем, для работы не нужная и не знакомая. Для того, чтобы говорить про ООП, нам селениум не нужен. Попробуйте придумать простой и всем понятный виртуальный пример, про котиков, кирпичные дома или геометрические фигуры - пофигу. И с кодом, конечно же, а то знаете на словах говорить о коде как-то хм…
Да я принцип хочу понять, а селениум там или что – не так важно. (как мне кажется) важно “на лету” модифицировать некий экземпляр класса, который нежелательно многократно пересоздавать. В принципе, сейчас я в __init__ этих вспомогательных классов и передаю этот экземпляр,
class Part1:
def __init__(self, session):
self.web = session

def action(self, act):
...
self.web.some_action()
Но это как-то некрасиво, как мне кажется. Прошу прощения, со всем понятными котиками сложно
FishHook
_angus_
Но это как-то некрасиво, как мне кажется
Да в общем то нет, это называется внедрение через конструктор.
https://habr.com/ru/post/352530/
_angus_
FishHook
Ясно, спасибо, не буду изобретать велосипед…
JOHN_16
Можно ж проще через динамическое присваивание
 >>> 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
_angus_
JOHN_16
Можно ж проще через динамическое присваивание
Интересно, кстати! Но методов десятки, каждый раз их динамически присваивать – явно что-то да пропустишь, да и конфликты имён возможны.
JOHN_16
_angus_
каждый раз их динамически присваивать – явно что-то да пропустишь
эээ что знаичт каждый раз? вы их руками в рантайме что ли прописываете? Как то не понятно. Ваше сообщение звучит так будто у вас есть какая то проблема с этим, но я никак не могу понять где. Если у вас много методов … ну оберните их в 1 функцию, которая будет все делать. И вызывайте ее когда надо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB