Может ли класс python возвращать новый экземпляр своего класса?

действителен ли следующий код python?

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

  def returnTest(self):
    return Test()

4 ответов


Да это действительно. Класс определяется временем создания объекта и вызова returnTest метод.

In [2]: x = Test()

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

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

In [5]: 

однако в случаях, когда метод действует как фабрика, вы можете рассмотреть возможность использования classmethod оформителя. Когда наследство и другие неприятности приходят на пути, это может помочь.


Да, это действует. returnTest не будет запущен, пока он не будет вызван. Он не создает бесконечный цикл, так как метод не вызывается для вновь созданного объекта.


да. Это действительный код python. Многие языки программирования позволяют возвращать экземпляр определяемого класса. Думаю, что до синглтон узор.


Да, он работает, но кажется, что returnTest () всегда является одним и тем же экземпляром теста.

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

  def returnTest(self):
    return Test()


t = Test()
print t
print t.returnTest()
print t.returnTest()


$ python te.py
<__main__.Test instance at 0xb72bd28c>
<__main__.Test instance at 0xb72bd40c>
<__main__.Test instance at 0xb72bd40c>

Это верно для Python 2.7 и 3.2. @classmethod не имеет значения. Интересно, что pypy каждый раз возвращает другой экземпляр:

$ pypy te.py
<__main__.Test instance at 0xb6dcc1dc>
<__main__.Test instance at 0xb6dcc1f0>
<__main__.Test instance at 0xb6dcc204>