Импортировать класс Python, в котором есть только __new__, в Robot Framework - PullRequest
0 голосов
/ 30 мая 2019

Имейте класс 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__)

Ответы [ 2 ]

1 голос
/ 30 мая 2019

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

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

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

1 голос
/ 30 мая 2019

__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()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...