从类方法创建新的类实例

2024-05-14 15:26:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望能够通过调用已实例化对象的方法来创建对象的新实例。例如,我有一个对象:

organism = Organism()

我希望能够调用organism.reproduce(),并拥有两个类型为Organism的对象。我的方法是这样的:

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

我很确定它不起作用(我甚至不确定如何测试它)。我在this post中尝试了gc方法。所以,我怎样才能让我的对象创建一个自己的副本,就像我创建的第一个对象一样(使用organism = Organism())是可访问的?


Tags: 对象实例方法类型objectdef副本this
3条回答

像这样的事情呢:

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
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()

这确保了有机体产生更多的有机体和(假想的从有机体中衍生出来的Borgs产生更多的Borgs)。

不需要使用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)

相关问题 更多 >

    热门问题