Имейте класс Python, который импортируется в Robot Framework следующим образом:

Python: MyClass.py

class MyClass:
    def __new__(cls, a, b):
        # implementation here

Структура робота: MyTest.robot

*** Settings ***
Library    MyClass.py    a=1    b=2

Получение ошибки Error in file 'MyTest.robot': Test Library 'MyClass' expected 0 arguments, got 2.

Я понимаю, что ошибка в том, что MyClass не определен __init__ (если он определен, ошибки импорта нет).

У меня вопрос: как я могу импортировать MyClass.py, для которого определено __new__, но нет __init__?

(не вдаваясь в детали того, почему у меня __new__, а не __init__)

0
Joao Coelho 30 Май 2019 в 23:01

2 ответа

Лучший ответ

Согласно документации по питону, __new__ будет передать полученные аргументы __init__. Поскольку вы не создали __init__, который принимает аргументы, вот почему вы получаете ошибку.

Если __new__() возвращает экземпляр cls, то будет вызван метод __init__() нового экземпляра, например __init__(self[, ...]), где self - новый экземпляр , а остальные аргументы - так же, как были переданы __new__() .

Если вы не хотите, чтобы __init__ вызывался, вы можете получить некоторую помощь по этому вопросу: Можно ли запретить вызов init?

1
Bryan Oakley 30 Май 2019 в 20:56

__new__ отвечает за создание экземпляра, а __init__ является просто инициализатором после создания экземпляра. Сначала всегда называется __new__, а затем __init__. __new__ всегда @staticmethod по умолчанию, но вы также можете использовать @staticmethod декоратор (тоже самое).

class Foo:

    @staticmethod
    def __new__(cls):
        print('Foo.__new__ is called')
        obj = super().__new__(cls)
        print(obj) # <__main__.Foo object at 0x7f82c1403588> This is "f" object.
        return obj

    def __init__(self, *args, **kwargs):
        print('Foo.__init__ is called !!!')

f = Foo()

Надеюсь, это поможет вам.

1
gachdavit 30 Май 2019 в 20:13