python类可以返回其类的新实例吗?

cyt*_*nus 12 python class

以下python代码是否有效?

class Test:
  def __init__(self):
    self.number = 5

  def returnTest(self):
    return Test()
Run Code Online (Sandbox Code Playgroud)

Nou*_*him 19

是的,它是有效的.该类由您创建对象并调用该returnTest方法的时间定义.

In [2]: x = Test()

In [3]: y = x.returnTest()

In [4]: y
Out[4]: <__main__.Test instance at 0x1e36ef0>

In [5]: 
Run Code Online (Sandbox Code Playgroud)

但是,如果方法的行为类似于工厂,您可能需要考虑使用classmethod装饰器.当继承和其他烦恼出现时,这可能会有所帮助.


Exp*_*led 5

当使用子类时,我建议使用更像这样的东西:

return type(self)(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

这确保了返回的类型与返回它的类相同。

这是一个完整的示例:

class Test():
    def __init__(self):
        self.number = 5

    def returnTest(self):
        return type(self)()

class SubTest(Test):
    def __init__(self):
        super().__init__()
        self.number = 6

t1 = Test()
t2 = SubTest()
print( type(t1.returnTest()), type(t2.returnTest()) )
Run Code Online (Sandbox Code Playgroud)

输出:

<class '__main__.Test'> <class '__main__.SubTest'>
Run Code Online (Sandbox Code Playgroud)