Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从类方法创建新的类实例_Python_Object_Copy - Fatal编程技术网

Python 从类方法创建新的类实例

Python 从类方法创建新的类实例,python,object,copy,Python,Object,Copy,我希望能够通过对已经实例化的对象调用方法来创建对象的新实例。例如,我有一个对象: organism=organism() 我希望能够调用Organic.reproduction(),并拥有两个类型为Organic的对象。此时,我的方法如下所示: class Organism(object): def reproduce(): organism = Organism() class Organism(object): population = [] d

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

organism=organism()

我希望能够调用
Organic.reproduction()
,并拥有两个类型为Organic的对象。此时,我的方法如下所示:

class Organism(object):
    def reproduce():
        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]
我很确定它不起作用(我甚至不确定如何测试它。我在年尝试了gc方法)。那么,如何让我的对象创建一个可以访问的自身副本,就像我创建的第一个对象一样(使用
organism=organism()

另一个选项——如果实例(
self
)未在方法中使用:

class Organism(object):
    @classmethod
    def reproduce(cls):
        return cls()
class Organism(object):
    def reproduce(self):
        #use self here to customize the new organism ...
        return self.__class__()  # same as cls = type(self); return cls()
这确保了有机体产生更多的有机体,并且(从有机体衍生的假想博格产生更多的博格)

不需要使用
self
的一个附带好处是,除了可以从实例调用之外,现在还可以从类中直接调用它:

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

最后,如果实例(
self
)和类(
organic
或子类,如果从子类调用)都在方法中使用:

class Organism(object):
    @classmethod
    def reproduce(cls):
        return cls()
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

当您在解释器中执行该行时,您现在有了一个变量
organic
,它引用了您刚刚创建的新
organic
实例

当您在函数(包括方法)中写入该行时,因为“从内部”在方法和函数之间没有区别,所以它执行相同的操作,但是变量
organic
是一个局部变量。当函数完成时,局部变量会被丢弃,因此这确实会创建一个新的
Organism
实例,但它没有实现任何功能,因为您永远无法访问它

您的函数应该返回它想要与调用者通信的任何信息。任何不返回的局部变量只有在使用这些变量创建要返回的内容时才有用


请注意,这与在方法内创建实例的特定问题无关;这只是函数/方法通常的工作方式。在使用类和实例成功编写面向对象的程序之前,您需要了解函数是如何工作的;我强烈建议您学习一些教程。

这样的内容怎么样:

class Organism(object):
    def reproduce():
        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
>a=生物体('a')
>>>len(生物体、种群)
1.
>>>a.繁殖(['x','y','z'])#当一个有机体繁殖时,会添加孩子
#占总人口的比例
#有机体产生的孩子和你说的一样多
[, ]
>>>对于生物体中的ele.population:
...     打印元素名称
... 
A.
x
Y
Z
>>>有机体。种群[3]。繁殖(['f','g'])
[, ]
>>>对于生物体中的ele.population:
...     打印元素名称
... 
A.
x
Y
Z
F
G

我想你是在问如何复制对象。 令人惊讶的是(也许),目前(几乎)还没有标准的方法,这是设计的。这个问题源于复制概念的内在模糊性,即:当您复制对象属性时,您的意思是将其作为引用(复制)还是作为值(复制)

但是,在大多数情况下,您需要一致的行为(deepcopy或copy for all properties),在这种情况下,您可以使用
copy
模块作为

import copy
new_obj = copy.copy(old_obj)

在需要更定制的行为的一般情况下,您可以使用相同的命令,但会覆盖对象的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法

有关详细信息和示例,请参阅更多答案,例如:

我想当你说
复制
时,你的意思是
克隆
,对吗?如果是这样的话,那么告诉我们你的<代码>有机体<代码>的定义特征/属性是什么将非常有帮助,这样做是正确的。我发现这个解释非常有用,但是你能详细解释一下“如果实例不重要”与“如果实例和类都重要”的含义吗?在我的例子中,
@classmethod
方法和
self.\uu class\uuu()
方法都起作用:我有一个基类方法
get\u copy
,它创建子类的一个新实例(?),然后我使用
\uu dict\uu
将新的子类转换为原始类的“副本”。在这种情况下,一种方法比另一种更合适吗?@isoscelesweel--我已经稍微更新了文本。基本上,我说的是函数创建新实例所需的数据。换句话说,“如果实例不重要”与“如果函数中没有使用If
self
”是一样的。希望更新后的文本能让它更清楚。