Создать новый экземпляр класса из метода класса

Я хочу, чтобы иметь возможность создать новый экземпляр объекта, вызвав метод на уже созданный объект. Например, у меня есть объект:

organism = Organism()

Я хочу, чтобы иметь возможность вызвать organism.reproduce() и иметь два объекта типа Организм. Мой метод в этот момент выглядит следующим образом:

 class Organism(object): def reproduce(): organism = Organism() 

и я уверен, что он не работает (я даже не уверен, как его протестировать. Я попытался использовать gc-метод в этом сообщении ). Итак, как я могу сделать свой объект созданием самой копии, доступной так же, как и первый объект, который я создал (с organism = Organism() )?

4 Solutions collect form web for “Создать новый экземпляр класса из метода класса”

 class Organism(object): def reproduce(self): #use self here to customize the new organism ... return Organism() 

Другой вариант – если экземпляр ( self ) не используется в методе:

 class Organism(object): @classmethod def reproduce(cls): return cls() 

Это гарантирует, что Организмы производят больше Организмов и (гипотетические Борги, которые происходят от Организмов, производят больше Боргов).

Боковым преимуществом, которое не нужно использовать self является то, что теперь его можно вызывать из класса непосредственно в дополнение к тому, чтобы быть вызванным из экземпляра:

 new_organism0 = Organism.reproduce() # Creates a new organism new_organism1 = new_organism0.reproduce() # Also creates a new organism 

Наконец, если в методе используются как экземпляр ( self ), так и класс ( Organism или подклассы, если они вызваны из подкласса):

 class Organism(object): def reproduce(self): #use self here to customize the new organism ... return self.__class__() # same as cls = type(self); return cls() 

В каждом случае вы будете использовать его как:

 organism = Organism() new_organism = organism.reproduce() 

почему бы просто не использовать модуль копирования?

 import copy organism = Organism() replica = copy.deepcopy(organism) 

То же самое, что вы делали изначально, но тогда вам нужно что-то сделать с этим!

organism = Organism() вызывает класс Organism (скобки непосредственно после имени – это операция «вызов»). Это создает и возвращает новый экземпляр класса, который вы затем привязываете к названию organism .

Когда вы выполняете эту строку в интерпретаторе, теперь у вас есть переменный organism ссылающийся на новый экземпляр Organism вы только что создали.

Когда вы пишете эту строку внутри функции (включая метод, потому что нет никакой разницы между методом и функцией «изнутри»), он делает то же самое, но переменная organism является локальной переменной. Локальные переменные отбрасываются, когда функция завершена, поэтому это создает новый экземпляр Organism , но он ничего не достигает, потому что вы никогда не получаете к нему доступа.

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

Обратите внимание, что это не имеет никакого отношения к вашей конкретной проблеме создания экземпляра внутри метода; это то, как работают функции / методы в целом. Вам нужно будет узнать, как работают функции, прежде чем вы сможете успешно писать объектно-ориентированные программы, используя классы и экземпляры; Я бы настоятельно предложил вам работать с некоторыми учебниками.

Что-то вроде этого:

 class Organism(object): population = [] def __init__(self, name): self.name = name self.population.append(self) def have_one_child(self, name): return Organism(name) def reproduce(self, names): return [self.have_one_child(name) for name in names] 

Результат:

 >>> a = Organism('a') >>> len(Organism.population) 1 >>> a.reproduce(['x', 'y', 'z']) # when one organism reproduces, children are added # to the total population # organism produces as many children as you state [<__main__.Organism object at 0x05F23190>, <__main__.Organism object at 0x05F230F0>, <__main__.Organism object at 0x05F23230>] >>> for ele in Organism.population: ... print ele.name ... a x y z >>> Organism.population[3].reproduce(['f', 'g']) [<__main__.Organism object at 0x05F231D0>, <__main__.Organism object at 0x05F23290>] >>> for ele in Organism.population: ... print ele.name ... a x y z f g 
  • Удалить все объекты в списке
  • Смутно о __str__ в Python
  • Почему оператор «есть» говорит, что эти методы не совпадают?
  • Каков прецедент для метода __new__ для возврата объекта другого типа, чем его первый аргумент?
  • Создайте базовый итератор Python
  • Почему Python не вызывает метод экземпляра __init __ () при создании экземпляра, но вызывает вместо него класс __init __ ()?
  • TypeError: object () не принимает параметров
  • Python: Как получить атрибут атрибута объекта с getattr?
  • Python - лучший язык программирования в мире.