当重新运行代码时,在python中存储类实例的最佳实践是什么?
假设我有以下代码:当重新运行代码时,在python中存储类实例的最佳实践是什么?,python,python-3.x,oop,methods,Python,Python 3.x,Oop,Methods,假设我有以下代码: import pandas as pd import cx_Oracle class Foo: instances = [] def __init__(self, id, name): self.id = id self.name = name dsn_tns = cx_Oracle.makedsn('***', '***', service_name='***') conn = cx_O
import pandas as pd
import cx_Oracle
class Foo:
instances = []
def __init__(self, id, name):
self.id = id
self.name = name
dsn_tns = cx_Oracle.makedsn('***', '***', service_name='***')
conn = cx_Oracle.connect(user=r'***', password='***', dsn=***)
self.data = pd.read_sql(***, conn)
conn.close()
Foo.instances.append(self)
def method1(...):
...
def method2(...):
...
one = Foo(1, 'one')
在这里,我创建一个类并初始化该类的一个(或多个)实例
在本例中,我将从oracle服务器导入一些数据,这需要很长时间才能运行SQL查询
假设我在对象上运行method1:
one.method1...
运行此命令后,我决定在一个上使用method2:
one.method2...
现在,我必须再次运行代码,该代码必须将其中一个重新初始化为类Foo的实例,这将强制SQL查询重新运行,这需要时间。它还将在可能需要很长时间的主机上重新运行method1
我是一个初学者,所以我想知道什么是最好的方法来解决这个问题
类似于将一个存储在内存中,这样当我重新运行代码时,它就不必再次初始化一个并将该方法直接应用于内存中的对象
还有一种方法可以存储method1的潜在输出,以便在运行时
one.method1
one.method2
如果它以前运行过,则不必重新执行one.method1
显然,这不是运行速度快的问题,而是在一个类和许多类中包含许多方法和许多对象的代码上的问题。我可以想象这将变得势不可挡
我确信确实存在一个解决方案和最佳做法,但我正努力在这个问题上寻求帮助
我怀疑这是所有面向对象编程(OOP)的普遍现象,而不仅仅是python
谢谢。如果在调用其中一个方法时避免更改类Instance的数据,则可以运行其中任何一个方法,而
one
不会改变任何内容。这是显而易见的
如果您正在调用的方法确实对类的某些成员变量进行了更改,则可以创建实例的副本:
import copy
...
one = Foo(1, 'one')
one_bak = copy.copy(one)
one.method1
one = one_bak
one.method2
如果在调用其中一个方法时避免更改类Instance的数据,则可以简单地运行这两个方法中的任何一个,而
one
不会改变任何内容。这是显而易见的
如果您正在调用的方法确实对类的某些成员变量进行了更改,则可以创建实例的副本:
import copy
...
one = Foo(1, 'one')
one_bak = copy.copy(one)
one.method1
one = one_bak
one.method2
原则上,内存连接到Python程序(请参阅示例和此线程以了解可能的解决方案)
最简单的方法是对对象进行pickle处理,并在文件可用时取消pickle处理。有关更多信息,请参阅。原则上,内存连接到Python程序(有关可能的解决方案,请参阅示例和此线程)
最简单的方法是对对象进行pickle处理,并在文件可用时取消pickle处理。有关更多信息,请参阅。但您仍然需要初始化一个。你说的是
one=Foo(1,'one')
所以每次我运行它时,我仍然需要初始化一个,对吗?。这正是我想要了解的避免方法。如果您想要从Foo()类中获得一个实例,并且为了构造该实例,需要一个SQL查询。是的,您必须至少初始化一次。您可以考虑将Foo()设置为“lazy”,并根据请求启动SQL查询。您说我必须至少初始化一次one
,但您的代码不会在每次运行代码时初始化它吗?明确地说,我只需要初始化它一次,然后就可以在不需要重新初始化的情况下对数据应用尽可能多的方法。在这种情况下,您需要序列化和存储对象。请参阅@Syzmon maszkeb的答案,但您仍然需要初始化一个。你说的是one=Foo(1,'one')
所以每次我运行它时,我仍然需要初始化一个,对吗?。这正是我想要了解的避免方法。如果您想要从Foo()类中获得一个实例,并且为了构造该实例,需要一个SQL查询。是的,您必须至少初始化一次。您可以考虑将Foo()设置为“lazy”,并根据请求启动SQL查询。您说我必须至少初始化一次one
,但您的代码不会在每次运行代码时初始化它吗?明确地说,我只需要初始化它一次,然后就可以在不需要重新初始化的情况下对数据应用尽可能多的方法。在这种情况下,您需要序列化和存储对象。请参阅@Syzmon MaszkeRemoveFoo.instances.append(self)
makeself.data
aclass变量
的答案,并仅第一次根据条件运行所有oracle
。例如if not Foo.data:…
RemoveFoo.instances.append(self)
makeself.data
aclass变量
,并仅在第一次根据条件运行所有oracle
。例如如果不是Foo.data:…