Python установить собственные переменные другим классом, используя cls? - PullRequest
0 голосов
/ 31 марта 2020

Интересно, возможно ли установить переменные класса другим классом, используя cls?

История, стоящая за этим: я пишу тесты для разных целей, но вижу, что одна часть Настройка такая же, как в уже существующем классе. Поэтому я бы сделал setUp по уже существующему:

Оригинальный код:

class TestBase(unittest.TestCase):
    def setUp(self):
        self.handler = txt.getHandler(hcu.handler3())
        self.curves = self.handler.curves()
        self.arguments = (getInit())
        self.ac = self.connect2DB(self.arguments)
        self.au = AutoUtils()

До сих пор это работало хорошо. Теперь в моем TestClient я хотел бы использовать это:

from .testsDB import TestBase as tb
class TestClient(unittest.TestCase):

    def setUp(self):
        tb.setUp()

И изменил в TestBase setUp следующее:

@classmethod
def setUp(cls):
    cls.handler = txt.getHandler(hcu.handler3())
    cls.graph = cls.handler.curves()
    cls.argv = (getInit())
    cls.ac = cls.connect2DB(cls.arguments)
    cls.au = AutoUtils()

Но Я получаю сообщение об ошибке, как только я использую одно из значений, определенных в переменных класса TestClient:

def test_Duplicates(self):
    self.testDB = self.ac.connect(self.ac.client, self.arguments[4])

С ошибкой:

In  test_Duplicate (Curves.tests_client.TestClient) :

 Traceback (most recent call last):
  File "/home/qohelet/Curves/tests_client.py", line 49, in test_Duplicate
    self.testDB = self.ac.connect(self.ac.client, self.arguments[4])
AttributeError: 'TestClient' object has no attribute 'ac'

Is на самом деле возможно то, что я пытаюсь?

РЕДАКТИРОВАТЬ: После написания этого и просмотра ответов я сделал еще один обзор. Да, действительно, у меня есть круговая проблема.

TestBase имеет функцию connect2DB, которая будет выполняться на setUp. Если это относится к себе (как в оригинале), это хорошо. Если я заменю себя на cls, он попытается выполнить TestClient.connect2DB в setUp - которого не существует. Так что это потребует самообслуживания снова, поскольку ввод connect2DB в TestClient не вариант.

Как это решить?

1 Ответ

1 голос
/ 31 марта 2020

Конечно, ваш новый класс должен просто наследовать setup()?

from .testsDB import TestBase as tb
class TestClient(tb):
    def test_Duplicates(self):
        self.testDB = self.ac.connect(self.ac.client, self.arguments[4])

Весь смысл наследования в том, что вы не изменяете то, что наследуете. Ваш новый класс должен просто использовать то, что поставляется. Вот почему наследование иногда называют программированием по разнице.

...