@igreklpofrss

Как передать один объект в другие объекты и использовать его?

Не знаю как задать вопрос, поэтому опишу суть. Мне в качестве помощи нужны варианты реализации, поэтому подскажите как можно реализовать. Так же есть мои 2 варианта. Мб они будут похожи на ваши. Условно есть главный(main) класс, который вызывает методы из 3х других классов, заданных в переменных главного класса. Эти 3и класса управляют одним глобальным общим классом. Для большей детальности это вебдрайвер Selenium. Чтобы браузер не был попусту открыт, я его инициализирую в нужный момент и передаю в остальные классы.
Условно как это выглядит. Там описаны варианты реализации. Но может все таки у кого есть более верное решение, правильная идея?
# 1 class
class FirstClass:
    def __init__(self):
        self.webdriver = None

# 2 class
class SecondClass:
    def __init__(self):
        self.webdriver = None

# 3 class
class ThirdClass:
    def __init__(self):
        self.webdriver = None

# Main class
class MainClass:
    def __init__(self):
        # этот webdriver передаётся в другие классы. можно считать, что он "главный"
        self.webdriver = None
        self.first = FirstClass(self.webdriver)
        self.second = SecondClass(self.webdriver)
        self.third = ThirdClass(self.webdriver)

    def init_browser_v1(self):
        # инициализация драйвера. по наивности думал, что это рабочий вариант,
        # думал, что задав "главной" переменной объект,  переменные других объектов, 
        # ссылающиеся на главный, будут наследовать его значения, но я сглупил. это не 
        #правильно.
        self.webdriver = Chrome()

    def init_browser_v2(self):
        # инициализация драйвера. Решил передавать объект таким образом. Вариант рабочий, 
        # но есть проблема. При возникновении ошибки драйвера во время работы в одном из 
        # классов, в классе с ошибкой значение драйвера становится None, в других объект 
        # сохраняется. 
        self.webdriver = Chrome()
        self.first.webdriver = self.webdriver # здесь webdriver = Chrome
        self.second.webdriver = self.webdriver # здесь webdriver = None, из-за возникшей ошибки
        self.third.webdriver = self.webdriver # здесь webdriver = Chrome

    def init_browser_v3(self):
        class WD:
            def __init__(self):
                self.wd = Chrome()
        # создать класс, в котором будет хранится вебдрайвер, но вызовы становятся 
        # громоздкими. Условно будет выглядеть так. self.webdriver.wd.get("url")
        self.webdriver = WD()
        self.first.webdriver = self.webdriver 
        self.second.webdriver = self.webdriver
        self.third.webdriver = self.webdriver
  • Вопрос задан
  • 80 просмотров
Пригласить эксперта
Ответы на вопрос 1
@maximq
QA Engineer
Соблюдайте принципы — DRY (Don’t repeat yourself).
Используйте наследование классов, подробнее: раз, два
Вы можете создавать объекты класса и хранить их в массиве:
# Main class
class MainClass():
    def __init__(self):
        # этот webdriver передаётся в другие классы. можно считать, что он "главный"
        self.webdriver = None
        self.number_of_class = "Main"

class SubClass(MainClass):
    def __init__(self, number):
        self.number_of_class = number

webdrivers = [SubClass("first_class"), SubClass("second_class"), SubClass("third_class")]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы