【问题标题】:Is there a way in a class function to return an instance of the class itself?类函数中有没有办法返回类本身的实例?
【发布时间】:2020-08-21 12:06:23
【问题描述】:

我在 python 中有一个带有函数的类,我需要该函数显式返回该类的实例。我试过这个

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

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

但我收到错误“a 未定义”。我该怎么办?谢谢。

【问题讨论】:

  • 这里有几处错误 - 在foo 中没有self
  • 是的,抱歉,这是一个示例,而不是我正在使用的实际代码。谢谢。 :)

标签: python class return instance


【解决方案1】:

由于 OP 在成员函数中使用了注解。注释中也有一个 NameError 。解决这个问题。请尝试以下操作:

参考:

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

注释实例和类方法

在大多数情况下,类和实例方法的第一个参数确实 不需要注解,假设有 包含实例方法的类和类型对象类型 对应于类方法的包含类对象。在 另外,实例方法中的第一个参数可以注解 带有类型变量。在这种情况下,返回类型可以使用相同的 类型变量,从而使该方法成为泛型函数。

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

【讨论】:

  • 很高兴知道!你为什么要输入提示self?有什么(合理的)方法可以弄错吗?
【解决方案2】:

你问的有效:

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__() 方法中完成。

【讨论】:

  • 感谢所有建议!
猜你喜欢
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
相关资源
最近更新 更多