Есть ли способ в функции класса вернуть экземпляр самого класса? - PullRequest
0 голосов
/ 06 мая 2020

У меня есть класс в python с функцией, и мне нужна эта функция для явного возврата экземпляра этого класса. Я пробовал это

class a(type):
    def __init__(self, n):
        self.n = n

    def foo() -> a:
        return a(self.n + 1)

, но получаю сообщение об ошибке «a не определено». Что я должен делать? Спасибо.

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Так как OP использовал аннотацию в функции-члене. В аннотации также есть NameError. Чтобы это исправить. Попробуйте следующее:

Ссылка:

https://www.python.org/dev/peps/pep-0484/#id34

Аннотирование методов экземпляра и класса

В большинстве случаев Первый аргумент методов класса и экземпляра не требует аннотации, и предполагается, что он имеет тип содержащего класса для методов экземпляра и тип объекта типа, соответствующий объекту содержащего класса для методов класса. Кроме того, первый аргумент в методе экземпляра может быть аннотирован переменной типа. В этом случае тип возвращаемого значения может использовать переменную того же типа, что делает этот метод универсальной функцией c.

from typing import TypeVar

T = TypeVar('T', bound='a')


class a:
    def __init__(self: T, n: int):
        self.n = n

    def foo(self: T) -> T:
        return a(self.n + 1)


print(a(1).foo().n)

Результат:

2
1 голос
/ 06 мая 2020

То, что вы запрашиваете, работает:

class A:
    def __init__(self, n):
        self.n = n

    def foo(self):
        return A(self.n + 1)


a = A(1)
b = a.foo()

print(a.n, b.n)

Однако есть несколько проблем с вашим исходным кодом.

  • Подсказка типа -> A не работает, потому что A не определен в этот момент.
  • Вам также необходимо передать self методу foo.
  • Если вы создаете подкласс type и хотите использовать его функции, я предлагаю вам также инициализировать его вызывая super().__init__() и передавая все необходимые аргументы. Вы можете сделать это в любой момент по своему усмотрению, но обычно это делается с помощью метода __init__() подкласса.
...